TCP报文头

网络协议栈,上层的实现基于下层提供的服务,体现在协议栈数据封装上,不断的用更底层的头部封装数据。

最内部为顶层的应用程序数据,然后是TCP头部,IP头部,最后是以太网头部

TCP报文头_第1张图片

 

TCP协议提供面向连接的可靠的基于字节流的传输服务

其头部基本格式如下:

TCP报文头_第2张图片

 

其中16位源、目的端口指明通信的双方端口

32位序列号seq为所发送报文段的字节流的第一个字节序号

32位确认号ack为接收方在收到发送方的字节流后,若其发送序号x 返回ack=x+1

标记位:标记位每一个标记占用一个bit  也就是或者为0 或者为1(标记)

  • SYN=1:该标记位为1表示建立连接的TCP报文段
  • ACK=1:该标记位为1表示该TCP报文段含确认信息
  • FIN=1:该标记位为1表示关闭连接的TCP报文段

RST:该标记位为1表示重新建立连接,复位

URG:紧急指针是否有效

PSH:通知接收方及时处理tcp缓冲,以接收后续数据

 

 

以TCP三次握手为例:

①客户端=》服务器:SYN=1表明是建立连接信号,seq=x,字节流序号,同时进入syn_sent状态,即发出连接请求

②服务器=》客户端:

SYN=1由于是双向连接,表明是建立连接信号,ACK=1表明该报文段同时含有序号确认信息

32位确认号ack=x+1表明已经收到客户端x序号报文,同时seq=y表明自身的报文字节流序号为y,进入syn_recv状态

③客户端=》服务器:

ACK=1表明该报文段含有确认信息,32位确认号ack=y+1表明已经收到客户端y序号报文,进入estalished状态,服务器收到该报文段后,进入established状态,双方建立连接

三次握手示意图

TCP报文头_第3张图片

 

三次握手是确保双方的接收都没有问题的最少次数,另外不采用二次握手是防止失效的连接请求报文(延迟)到达服务器后,若采用二次握手,那么只要服务器进行应答ACK 即建立连接,而此时服务器一直等待客户端基于该连接的数据传输,客户端认为该连接失效而不予理会,双方浪费资源。

 

 


 

TCP四次挥手,由于TCP是双全工的连接方式,因此数据的流向含有两条,每条流向的数据都需要单独关闭

客户端=》服务器:FIN=1表示该报文段为关闭连接请求,seq=u表明该报文段字节流序号为u,进入finish_wait1状态

服务器=》客户端:ACK=1表明该报文段含有确认信息,ack=u+1,服务器并不立即关闭,而是进入closed_wait状态

因为其上层的数据可能还没有发送完,需要一个等待,客户端收到该信息后,该方向不再发送数据,进入finish_wait2状态

服务器=》客户端:FIN=1表明该报文段为关闭连接请求,关闭的是服务器-》客户端的传输方向,同时seq=v指明字节流序号

客户端=》服务器:ACK=1表明该报文段含有确认信息ack=v+1,收到该信息后,客户端进入time_wait状态,服务器收到最终的ACK后,关闭连接,客户端当time_wait时间结束后,关闭连接。

四次挥手示意图:

TCP报文头_第4张图片


 

为何关闭连接是四次,因为关闭连接需要每条方向单独关闭,当服务器第一次收到FIN关闭连接请求时,只能回复ACK=1关闭从客户端到服务器这一方向,因为自身可能还有数据没有发送完,因为进入closed_wait等待数据发送完,在由服务器发送FIN报文,请求关闭服务器到客户端的数据传输。

 

 

 

 

 

 

你可能感兴趣的:(计算机网络)