TCP报文头
网络协议栈,上层的实现基于下层提供的服务,体现在协议栈数据封装上,不断的用更底层的头部封装数据。
最内部为顶层的应用程序数据,然后是TCP头部,IP头部,最后是以太网头部
TCP协议提供面向连接的可靠的基于字节流的传输服务
其头部基本格式如下:
其中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状态,双方建立连接
三次握手示意图
三次握手是确保双方的接收都没有问题的最少次数,另外不采用二次握手是防止失效的连接请求报文(延迟)到达服务器后,若采用二次握手,那么只要服务器进行应答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时间结束后,关闭连接。
四次挥手示意图:
为何关闭连接是四次,因为关闭连接需要每条方向单独关闭,当服务器第一次收到FIN关闭连接请求时,只能回复ACK=1关闭从客户端到服务器这一方向,因为自身可能还有数据没有发送完,因为进入closed_wait等待数据发送完,在由服务器发送FIN报文,请求关闭服务器到客户端的数据传输。