TCP协议概述
Tcp协议
一、如何理解TCP协议
TCP(Transfer Control Protocol,传输控制协议),是面向连接的端对端全双工通信方式,提供可靠的字节流传输。
二、报文格式及其含义
格式:
含义:
(1)源端口和目的端口:各占2字节,分别写入源端口号和目的端口号;
(2)序号:占4字节,本报文段发送的第一个字节的数据在总发送数据中的序号。范围为0至2的32次幂减1,序号超出范围好采用对2的32次幂取余重复利用;
(3)确认号:占4字节,期望下一次收到对方发送报文段的第一个数据字节的序号;
(4)数据偏移:占4字节,以4字节为计量单位,指出该报文携带的数据起始位置相对于报文头部起始位置的相对距离;
(5)保留:占6比特位,保留以后使用,目前置零;
(6)紧急 URG:URG置1时,标识紧急指针字段生效,即告知系统此报文中有紧急数据,需尽快传送,而不按照原来的排队顺序发送;
(7)确认 ACK:仅当ACK值为1时,确认号字段才有效。TCP规定在连接建立后,所有传送的报文段ACK必须置1;
(8)推送 PSH:当PSH位置1时,告知系统尽快发送或交付该报文段,而不等到将缓冲区填满以后再向上交付;
(9)复位 RST:当RST为1时,表明连接中出现严重差错,需要释放并重新建立连接。还可用于拒绝非法报文段和拒绝打开一个连接;
(10)同步 SYN:建立连接时用于同步序号。 SYN=1,ACK=0:连接请求报文,SYN=1,ACK=1:连接接受报文;
(11)终止 FIN:释放一个连接。当FIN=1时,表明此报文的发送方数据已发送完毕,并请求关闭该连接;
(12)窗口:占2字节,发送本报文段的一方的接收窗口大小;
(13)检验和:占2字节,校验首部和数据两部分;
(14)紧急指针:占2字节,指出本报文段中紧急数据的字节数。注意:即使窗口为0时,也可发送紧急数据;
(15)选项:长度可变,最大可达40字节。当没有使用选项时,TCP的首部长度是20字节。
三、TCP建立连接的三次握手
TCP采用客户端、服务器方式建立连接。其中,客户端主动打开连接,服务端被动打开连接。
(1)客户端:打开连接向服务端发送连接请求报文(SYN置1,并随机选取序号seq = x),用于请求连接和同步客户端数据序号,客户端进入同步已发送状态;
(2)服务端:收到客户端的请求连接报文后,由监听状态转为同步收到状态,若同意连接请求,则向客户端发送连接接受报文(SYN置1,ACK置1,并将ack置为x+1告知已接收的数据和下一次发送的数据起始位置,并随机选取服务端数据序号seq = y);
(3)客户端:接收到服务端的连接接受报文后,再次向服务端发送确认连接报文(ACK置1,并设置序号为x+1,ack置为y+1,告知已接收到序号为y的报文段:请求接受报文,与下次发送数据的起始序号),客户端状态由同步已发送状态转为连接已建立状态,服务端接收到此报文后由同步已接收状态进入连接已建立状态,数据传输开始。
TCP规定,同步报文段不能携带数据,但要消耗一个序号。
四、TCP释放连接的四次挥手
数据传输结束后,双方都可释放连接。 这里设定主动关闭连接端为客户端,被动端为服务端。
(1)客户端:发送完数据后,向服务端发送连接释放报文(FIN置1,序号u=发送过的最后一个字节的序号+1),由连接已建立状态转为终止等待1状态;
(2)服务端:接收到客户端的连接释放报文后发出确认(ACK=u+1,序号为v:之前发送数据的最后一个字节的序号+1),服务端由连接已建立状态转为关闭等待状态。此时连接处于半关闭状态(服务端至客户端方向的连接并未关闭)。客户端接收到服务端的连接释放确认报文后,进入终止等待2状态等待服务端发来连接释放报文,期间可能会有服务端发来的数据。
(3)服务端:没有要发送的数据后,向客户端发送连接释放报文(FIN置1,ACK置1,seq=w->期间可能有发送的数据,ack=u+1),服务端进入最后确认状态,等待客户端的确认;
(4)客户端:接收到服务端的连接释放报文后,向服务端发送连接释放确认报文(ACK置1,seq=u+1,ack=w+1)。客户端进入时间等待状态(等待2MSL后释放连接)。服务端在收到客户端的确认后,即释放连接。
五、TCP协议相关的部分问题
(1)为何要发送确认建立连接的报文?
防止已失效的连接请求报文又传送到了服务端。若客户端发送的连接请求报文并没有丢失,而是在某个网络节点长时间滞留,知道连接释放了才发送到服务端,则在无需确认就建立连接的情况下,服务端建立连接并等待数据到来,而客户端并未真的有此请求,因而浪费服务端的资源。
(2)主动释放连接的一端为何要在时间等待状态等待2MSL再释放连接?
保证主动释放端的最后一个确认报文段能够到达被动释放端。
防止已经失效的“连接请求报文段”出现在本连接中。客户端在发送完最后一个确认报文后,在经过2MSL就可以使本连接持续的时间内所产生的的所有报文段都从网络中消失。
TCP规定:FIN报文段即使不携带数据,也要消耗一个序号。
MSL(Maximum Segment Lifetime):最长报文段寿命。