TCP协议三次握手过程分析
概念:
TCP(Transmission Control Protocol)传输控制协议
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
具体如下:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务 器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.
实例1:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;
第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。
实例2(sniffer截获的TCP包):
Tcp三次握手_休闲
如第一行,为第一步握手,主机(192.168.1.5)发送一个SYN为1的请求包,在这个时候会随机的生成一个 SEQ(213162710)的序号,并等待远程主机(SZHXY.GUET.EDU.CN)回应;之后如第五行(阴影部分),远程主机 (SZHXY.GUET.EDU.CN)收到SYN为1的请求包后,表示同意请求(既然是请求那么SYN必为1),那么就发送一个 ACK=SEQ+1(213162711)的包,表示已经收到(192.168.1.5)的包,希望它发送下一个包,也就是SEQ+1的意思,同时自己也 产生一个随机的序号seq(994767769为了区分上个SEQ故用小写表示,注意这个是远程主机产生的,与192.168.1.5没有关系),回应给 (192.168.1.5);最后,也就是第三次握手,192.168.1.5最后发一个包,这个包主要是确定远程主机 (SZHXY.GUET.EDU.CN)发的第一个包已经收到,所以SYN=0,ACK=seq+1(994767770),如第六行。
到此三步握手完毕,为什么要产生SEQ呢?这也就是三步之后要做的事情,怎么说呢,TCP包是运输数据的,数据有长又 短,数据超过了一个包所能运输的时候就要分几次运输,众所周知网络存在着延迟,原本按理说应该按顺序到达这样方便组织,打个比方,一个卡车运一批货物,但 是这批货物太多,运不完要3架车来运,人们都会认为现到目的地的是先开的,但是由于公路机某些意外,第一架车在后面了,人们就无法知道谁第一个开车的,这 时候就需要在车厢标号,如1,2,3;这样不管发生什么状况都能分辨出来了,序号的作用也如此。当然,这只是简单的模式,复杂的还要涉及数据包分片和偏 移。
说到TCP三步握手中标志位的变化。那么三步后呢,数据又是如何组织和传输的?
TCP传输具体工作原理:
Tcp三次握手_握手_02
如图,前三行已经在前一篇文章进行说明,为TCP三步连接,下面重点介绍TCP三步后的连接。(为了方便说明记192.168.1.5为主机A,202.103.243.11为B主机)
三步连接完后,在第四行为A发送给B的数据其中包文内容如下图:
Tcp三次握手_职场_03
即有:
Sequence number(A)=823135436,那么按前三步握手的规律递推B回应包的Acknowledgment number(B)应该等于823135437(SEQ+1),是不是这样呢?答案不是下一个包(第五行)内容如下:
Tcp三次握手_休闲_04
然而Acknowledgment number(B)却等于823135640这就是我要说的数据大小和偏移的机制了,如上上图有个204 Bytes of data 这就告诉了我们这个包的数据大小。823135436+204=823135640这样就确定收到了主机B发给A的204字节的包,相当于B告诉A“我收 到了这204字节的包”。
接着看十一行(中间几个为其他数据包,不是联系在一起的)为B发给A的数据包,内容如下:
Tcp三次握手_握手_05
Acknowledgment number(B)还是等于823135640,为什么呢?其实他们是同一个原始数据只是TCP包不能帮他们装完,所以分开装起来,都是对于前一个A发给 B的TCP包时产生的SEQ的确认(注意细读这句话)。那么就会有个问题,到底哪个先那个后呢?怎么样才能远远本本的还原该报在原始数据中的位置?是通过 Sequence number序号来确认?前面说了Sequence number和大小有关,那么加上对应的包的大小也能推算出他们的次序,是一个方法,但是要确定谁先谁后主要还是通过IP协议的Identification判断,上图的Identification=12561,而上上图Identification=12560(在次没有截图出来)可以看出他们的先后了。(详细参阅IP层协议
接着,第十二行,内容如下:
Tcp三次握手_握手_06
与第十一行的性质相同,不再重复,看第十三行:
Tcp三次握手_握手_07
Acknowledgment number变了,变成3539917293,可以想象这是A发给B的确认信息Acknowledgment number=3539915694+406+1193=3539917293,即告诉B“我收到你给我的406+1193个字节了,请放心。”