TCP协议:报文格式、三次握手和四次挥手

TCP报文的首部格式

首先来看一下TCP报文的首部格式:
TCP协议:报文格式、三次握手和四次挥手
解释:
序号: 本报文段所发出的第一个字节的序号
确认号:期望接收到对方下一个报文的第一个数据字节的序号
ACK:仅当ACK等于1时,确认字段才有效
SYN:在建立连接时用的同步序号。当SYN=1,ACK=0时,表示是连接请求报文段。若响应SYN=1,ACK=1,表示对方同意建立连接
FIN:用来释放一个链接
窗口:从本报文首部的确认号开始,接收方允许对方发送的量
紧急指针:当URG=1时有效。指出紧急数据末尾在报文中的位置

TCP 建立连接的过程(三次握手)

Created with Raphaël 2.1.2TCP建立连接的过程ClientClientServerServerSYN=1,seq=xSYN=1,ACK=1,seq=y,ack=x+1ACK=1,seq=x+1,ack=y+1

TCP 关闭连接的过程(四次挥手)

Created with Raphaël 2.1.2TCP释放连接的过程ClientClientServerServerFIN=1,seq=uACK=1,seq=v,ack=u+1数据传送FIN=1, ACK=1, seq=w, ack=u+1ACK=1,seq=u+1,ack=w+1关闭等待2MSL关闭


  • 为什么Client在最后一次挥手后要等待2MSL?
    1. 为了保证Client发送的最后一个报文段能到达Server。如果Server未收到最后一个报文,则Client重传一次确认,重新启动2MSL计时器。如果Client不等待2MSL,则无法收到Server重传的FIN+ACK报文段,因此也不会再次发送确认报文段,这样Server就无法正常进入关闭状态。
    2. 防止“已失效的连接请求报文段”处出现在本连接中。即等待2MSL后,可以使连接持续期间所产生的所有报文段都从网络中消失,这样可以使下一个新的连接中不会出现这种旧的连接请求报文段。

MSL: Maximum Segment Life Time,最长报文段寿命。RFC793建议设为2分钟,但这完全是从工程上考虑的,对于现在的网络,MSL=2分钟太长,所以TCP允许不同的实现可根据具体情况使用更小的MSL

TCP的有限状态机

为了更清晰的看出TCP的各个状态,绘制了如下图所示的状态机

TCP协议:报文格式、三次握手和四次挥手