1、TCP客户端要连接到TCP服务器,需要经过三个过程:

以下是通过 Wireshark 抓取的三次握手数据包

No        Time            Source            Destination    Protocal  Length  Info         
505244 28619.472565 192.168.123.41 192.168.123.25 TCP → [SYN] Seq= Win= Len= MSS=
28627.965458 192.168.123.25 192.168.123.41 TCP → [SYN, ACK] Seq= Ack= Win= Len= MSS=
28627.967863 192.168.123.41 192.168.123.25 TCP → [ACK] Seq= Ack= Win= Len=

知识预备:

  数据包:包括报头和数据

  win:表示本机还有多少容量可以存储对方发来的数据(不包括报头),每个数据包都包含此值

  len:表示本机发送的这个数据包包含几个字节数据(不包括报头)

  MSS:全称为最大报文段长度,只在 SYN 包出现,表示本机接收一个数据包能接受的数据字节数(不包括报头),以后客户端和服务器发送的数据大小不能超过对方的MSS

  seq、ack:通过这两个值可以判断接收到的数据包是否是本机发送数据包的应答包

第一次握手:建立连接时,客户端发送:SYN(也就是SYN位置一),seq=x(x为任意数,一般为0) 到服务器,并进入SYN_SEND状态,等待服务器进行确认。(只有 SYN 置一表示此包是客户端发起的第一次握手)

第二次握手:服务器收到第一次握手包后,服务器发送:ACK,SYN,seq=y(y为任意数,一般为0),ack=x+1到客户端。(ACK置一,SYN置一表示此包是服务器发起的第二次握手)

第三次握手:客户端收到服务器端的SYN+ACK包,然后向服务器端发送确认包:ACK, seq=x+1,ack=y+1, 客户端发完进入ESTABLISHED状态,服务器端接收到进入ESTABLISHED状态,完成三次握手。

需要三次握手的原因:客户端发送第一次握手报文给服务器,此报文在网络的某个节点滞留时间比较长,长到客户端通过再次握手已经和服务器建立连接并且通信结束断开连接了,如果服务器只接收到第一次握手报文就和客户端建立连接,前面描述的情况服务器就会以为有客户端和它建立连接,实则不然。

三次握手流程图

一个数据包的组成

确定包类型:

URG------紧急指针 
    ACK------确认包
    PSH------接收方应该尽快将这个报文段交给应用层 
    RST------重建连接 
    SYN------同步包,用来发起一个连接 
    FIN-------发端应用层不再发送数据包

应用层如何发起三次握手

2、验证TCP三次握手

通过抓包软件获得三次握手这三个包的数据,当然如果每个包抓的彻底一点,不仅包括传输层(如:TCP)数据,还包括网际层(如:IP)和网络接口层;包的协议类型还分ethernet(有线网络)和802.11(无线网路)之分。

3、DOS攻击之SYN FLOOD攻击

原理:

  问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒 -2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接队列(SYN队列)而消耗非常 多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最 后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从 正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。

防范:
  
第一种是缩短SYN Timeout时间
  第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。

4、MSS

  TCP在三次握手中,每一方都会通告其期望收到的MSS(MSS只出现在SYN数据包中,表示本机接收一个数据包能接受的数据字节数(不包括报头)),在一个TCP连接上允许各种长度报文段的传输,因此连接的两端利用MSS选项来协商报文段中最大数据长度是必要的。例如在一个小型系统中由于空间限制,TCP仅能提供较小的接受缓冲区。它与其他系统通信时,就必需互相协商一个合适的MSS,使对端发出的报文段中的数据能够存入其接受缓冲器。由于TCP连接的各个端点可能存在的差异,在一个TCP连接的两个数据流方向上常常可能采用不同的MSS值。

  进行MSS协商的另一个好处是能够提高网络带宽的利用率。在一个局域网中进行通信的两个节点可以选择一个比较大的MSS,使得报文段封装成IP分组时能够充分利用网络的带宽。但是实际上在一般的Intenet 环境中,为连接选择一个合适的MSS是相当困难的。这是因为MSS的取值过大或过小都会影响网络和TCP的性能。如果报文段太小,将会大大降低网络的利用率(报头占总发送字节数大)。但如果报文段太大也可能影响网性能。这是由于长IP分组在网络中传输时往往需要被分片传输。分片和重组的过程自然将带来一定的网络处理开销。而且IP分组被分片后独立传输,任何一个分片出现错误或丢失都将导致整个分组被丢弃,这也意味着整个报文段丢失,TCP只能对整个IP分组进行确认和重传。由于在IP通信子网中分组丢失的概率总是存在的,因此MSS的增加所导致的分片将会使报文段成功达到目的端的概率下降,从而影响TCP的性能和和降低网络的吞吐率。

TCP ------ TCP三次握手(建立连接)及其相关内容的更多相关文章

  1. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...

  2. TCP的三次握手(建立连接)和四次挥手(关闭连接)(转)

    转自:(http://www.cnblogs.com/Jessy/p/3535612.html) 参照: http://course.ccniit.com/CSTD/Linux/reference/f ...

  3. 【转载】TCP的三次握手(建立连接)和四次挥手(关闭连接)

    建立连接: 理解:窗口和滑动窗口TCP的流量控制 TCP使用窗口机制进行流量控制 什么是窗口? 连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端 接收方发送的确认信息中包 ...

  4. TCP的三次握手(建立连接)与 四次挥手(关闭连接)

    一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: TCP报文格式上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位 ...

  5. Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web 服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠s ...

  6. TCP中三次握手建立和四次握手释放以及相关问题

    本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...

  7. HTTP 三次握手  建立连接 和  四次握手断开连接

    三次握手建立连接    第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机: 第二次握手:主机B收到请求后要确 ...

  8. tcp 三次握手建立连接难点总结

    所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包. 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号 ...

  9. TCP三次握手建立连接

    基本过程:       ISN(初始序号)随时间变化,每一个连接具有不同的ISN,防止在网络延迟中分组被重新发送.   请求端发送SYN(同步序号 )=1,seq=ISN(32bits序号,每4ms+ ...

  10. HTTP请求过程-域名解析和TCP三次握手建立链接

    我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机.整 ...

随机推荐

  1. Java基础知识:Java实现Map集合二级联动1

    Java实现Map集合二级联动 Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省 ...

  2. Intro to Probabilistic Model

    概率论复习 概率(Probability) 频率学派(Frequentist):由大量试验得到的期望频率(致命缺陷:有些事情无法大量试验,例如一封邮件是垃圾邮件的概率,雷达探测的物体是一枚导弹的概率) ...

  3. 关于wcf服务编译平台是x86, 运行平台是x64时,如何调试

    关于调试CTDC项目中的的 wcf服务时注意事项: 因为wcf项目引用的的 x86的程序集,所以wcf生成的目标平台为x86.故在64系统上调试需要执行下面的脚本 具体操作步骤: 1. 必须使用201 ...

  4. 【Machine Learning】如何处理机器学习中的非均衡数据集?

    在机器学习中,我们常常会遇到不均衡的数据集.比如癌症数据集中,癌症样本的数量可能远少于非癌症样本的数量:在银行的信用数据集中,按期还款的客户数量可能远大于违约客户的样本数量.   比如非常有名的德国信 ...

  5. The Activation Function in Deep Learning 浅谈深度学习中的激活函数

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html 版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激 ...

  6. 基础数据类型-tuple

    Python中,元组tuple与list类似,不同之处在于tuple的元素不能修改,tuple使用(),list使用[], (1)元组的创建使用(),需要注意的是创建包含一个元素的元组: tuple_ ...

  7. 第三课——MFC编程

    一.MFC概述 1. MFC简述 MFC不仅仅是一套基础类库,更是一种编程方式. 2. MFC由来 1987年微软公司推出了第一代Windows产品,并为应用程序设计者提供了Win16(16位Wind ...

  8. File Searching

    Description Have you ever used file searching tools provided by an operating system? For example, in ...

  9. RXSwift --UITableView之初探

    对于RXSwift中的一些基本概念和说明请参看其他文章,接下来我们使用RXSwift一步一步去构建TableView,从简单到复杂.iOS开发过程中tableView的使用率是最高的,他的一些代理方法 ...

  10. TCP系列38—拥塞控制—1、概述

    在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...