TCP协议:头部结构、三次握手与四次挥手

目录

一、TCP报文段

二、TCP的连接管理

三次握手(连接的建立)

四次挥手(连接的释放)


一、TCP报文段

TCP传送的数据单元称为报文段。一个TCP报文段分为TCP首部和TCP数据两部分,整个TC段作为IP数据报的数据部分封装在IP数据报中,如图5-6所示。其首部的前20字节是固定的。TCP报文段的首部最短为20字节,后面有4N字节是根据需要而增加的选项,通常长度为4字节的整数倍。

TCP报文段既可以用来运载数据,也可以用来建立连接、释放连接和应答。

1、源端口和目的端口字段  各占2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。


2、序号字段  占4字节。TCP是面向字节流的(就是说TCP传送时是按照一个一个字节来传送的),所以TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
例如:一报文段的序号字段值是301,而携带的数据共有100字节,这就表明本报文段的数据的最后一个字节的序号是400,故下一个报文段的数据序号应从401开始。


3、确认号字段  占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号若确认号-N,则表明到序号N-1为止的所有数据都已正确收到。
例如:B正确收到了A发送过来的一个报文段,其序号字段是指501,而数据长度是200字节(序501~700),这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。


4、数据偏移(即首部长度)占4位,这里不是IP数据报分片的那个数据偏移,而是表示首部长度,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
“数据偏移”的单位是32位(以4字节为计算单位)。因此当此字段的值为15时,达到TCP首部的最大长度60字节。


5、保留字段  占6位,保留为今后使用,但目前应置为0,该字段可以忽略不计。

6、紧急位URG  当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。但是URG需要和紧急指针配套使用,也就是说数据从第一个字节到紧急指针所指字节就是紧急数据。


7、确认位ACK  只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把 ACK置1。


8、推送位PSH (Push)  接收TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而再等到整个缓存都填满了后再向上交付。


9、复位位RST (Reset))当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。


10、同步位SYN  同步SYN=1表示这是一个连接请求或连接接收报文。
当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1,ACK=1。即,SYN=1就表示这是一个连接请求或连接接收报文。


11、终止位FIN (Finish) 用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。


12、窗口字段  占2字节。它指出了现在允许对方发送的数据量,接收方的数据缓存空间是有限的,故用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。
例如:设确认号是701,窗口字段是1000。这就表明,从701号算起,发送此报文段的一方还有接收1000字节数据(字节序号是701~1700)的接收缓存空间。


13、检验和  占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,和UDP一样,要在TCP报文段的前面加上12字节的伪首部(只需将UDP伪首部的第4个字段,即协议字段的17改成6,其他的和UDP一样)。


14、紧急指针字段  占16位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。


15、选项字段  长度可变。TCP最初只规定了一种选项,即最大报文段长度(MaximumSegment Size,MSS)。MSS是 TCP报文段中的数据字段的最大长度。


16、填充字段  这是为了使整个首部长度是4字节的整数倍。

二、TCP的连接管理

TCP是面向连接的协议。因此每一个TCP连接都有三个阶段:连接建立、数据传送和连接释放。TCP连接的管理就是使运输连接的建立和释放都能正常进行。

三次握手(连接的建立)


连接的建立经历以下3个步骤,通常称为“三次握手”。

第一步:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1.另外,客户机会随机选择一个起始序号seq=x (连接请求报文不携带数据,但要消耗掉一个序号)。

第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP 连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号 seq=y(确认报文不携带数据,但也要消耗掉一个序号)。确认报文段同样不包含应用层数据。

第三步:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK标志位被置1,序号字段为x+1,确认号字段ack=y+1。该报文段可以携带数据,如果不携带数据则不消耗序号。

四次挥手(连接的释放)

第一步:客户机打算关闭连接,就向其TCP发送一个连接释放报文段,并停止再发送数据,主动关闭TCP连接,该报文段的FIN标志位被置1,seq=u,它等于前面已传送过的数据的最后一个字节的序号加1 (FIN报文段即使不携带数据,也要消耗掉一个序号)。TCP是全双工的,即可以想象成是一条TCP连接上有两条数据通路。当发送 FIN报文时,发送FIN 的一端就不能再发送数据,也就是关闭了其中一条数据通路,但对方还可以发送数据。

 第二步:服务器收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自的序号是v,等于它前面已传送过的数据的最后一个字节的序号加1。此时,从客户机到服务这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出 FIN=1的连接释放报文段。
第四步:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号 seq=u+1。此时TCP 连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入到连接关闭状态。

来源url
栏目