您的位置:首页 > 理论基础 > 计算机网络

[网络基础知识]TCP报文结构

2011-05-04 17:24 344 查看
TCP是面向字节流的,但传送的数据单元却是报文段。

什么是报文

例如一个 100kb 的 HTML 文档需要传送到另外一台计算机,并不会整个文档直接传送过去,可能会切割成几个部分,比如四个分别为 25kb 的数据段。而每个数据段再加上一个TCP首部,就组成了TCP报文。一共四个 TCP 报文,发送到另外一个端。
另外一端收到数据包,然后再剔除TCP首部,组装起来。等到四个数据包都收到了,就能还原出来一个完整的HTML文档了。
在 OSI 的七层协议中,第二层(数据链路层)的数据叫「Frame」,第三层(网络层)上的数据叫「Packet」,第四层(传输层)的数据叫「Segment」。TCP 报文 (Segment),包括首部和数据部分。



而TCP的全部功能都体现在它首部中各字段的作用,只有弄清TCP首部各字段的作用才能掌握 TCP 的工作原理。
TCP 报文段首部的前20个字节是固定的,后面有4个字节是根据需要而增加的。







源端口(source port)、目的端口(destination port)

各占2个字节(16位);用来告知主机该报文段是来自哪里以及传送给哪个应用程序(应用程序绑定了端口)的。进行TCP通讯时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16=65536个。

序列号(sequence number)

占4个字节(32位)。保证网络传输数据的顺序性。TCP是面向字节流的,在一个TCP连接中传输的字节流中的每个字节都按照顺序编号。表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始。
例如 100 kb 的 HTML 文档数据,一共 102400 (100 * 1024) 个字节,那么每一个字节就都有了编号,整个文档的编号的范围是 0 ~ 102399。
那么 100 的HTML文档分割成四个等分之后,
第一个TCP报文段包含的是第一个25kb的数据,0 ~ 25599 字节, 该报文的序号的值就是:0
第二个TCP报文段包含的是第二个25kb的数据,25600 ~ 51199 字节,该报文的序号的值就是:25600
......
根据 8 位 = 1 字节,那么 4 个字节可以表示的数值范围:[0, 2^32],一共 2^32 (4294967296) 个序号。序号增加到最大值的时候,下一个序号又回到了 0.
也就是说TCP协议可对4GB的数据进行编号,在一般情况下可保证当序号重复使用时,旧序号的数据早已经通过网络到达终点或者丢失了。

确认号(acknowledgment number)

占4个字节(32位)。是期望收到对方的下一个报文段的数据的第一个字节的序号。用来解决丢包的问题。TCP的可靠性,是建立在「每一个数据报文都需要确认收到」的基础之上的。就是说,通讯的任何一方在收到对方的一个报文之后,都要发送一个相对应的「确认报文」,来表达确认收到。那么,确认报文,就会包含确认号。
例如,通讯的一方收到了第一个 25kb 的报文,该报文的 序号值=0,那么就需要回复一个确认报文,其中的确认号 = 25600.

数据偏移/首部长度(offset)

占0.5个字节(4位)。这个字段实际上是指出了TCP报文段的首部长度,它指出了TCP报文段的数据起始处距离TCP报文的起始处有多远。

保留(reserved)

占0.75个字节(6位)。保留为今后使用,但目前应置为0。

标志位(tcp flags)

一共有6个,分别占1位,共6位。每一位的值只有0和1,分别表达不同意思。

紧急URG(Urgent)

当 URG = 1 的时候,表示紧急指针(Urgent Pointer)有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。URG要与首部中的紧急指针(Urgent Pointer)字段配合使用。

确认ACK(Acknowlegment)

只有当ACK=1时,确认序号字段(Acknowledgment Number)才有意义;TCP规定,连接建立后,ACK必须为1。一般称携带ACK标志的TCP报文段为「确认报文段」

推送PSH(Push)

当 PSH = 1的时候,表示该报文段高优先级,接收方TCP应该尽快推送给接收应用程序,而不用等到整个TCP缓存都填满了后再交付。

复位RST(Reset)

当 RST = 1 的时候,表示TCP连接中出现严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
一般称携带RST标志的TCP报文段为「复位报文段」

同步SYN (Synchronization)

在建立连接时使用,用来同步序号.当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1。
一般称携带SYN标志的TCP报文段为「同步报文段」

终止FIN (Finish)

当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接。在TCP四次挥手释放连接的时候,就会用到该标志。
一般称携带FIN的报文段为「结束报文段」

窗口大小(window size)

占2个字节(16位)。该字段明确指出了现在允许对方发送的数据量,它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。窗口大小的值是指,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。
例如,假如确认号是701 ,窗口字段是1000。这就表明,从701号算起,发送此报文段的一方还有接收1000(字节序号是701 ~ 1700) 个字节的数据的接收缓存空间。
它用于流量控制,窗口大小根据网络拥塞情况和资源可用性进行增减。

检验和(checksum)

占2个字节(16位)。由发送端填充,接收端对TCP报文段执行CRC算法,以检验TCP报文段在传输过程中是否损坏,如果损坏这丢弃。用于检查TCP数据包头和数据的一致性。这也是TCP可靠传输的一个重要保障。
提供了额外可靠性,在计算检验和的时候,TCP的Checksum域设为0,如果数据域的字节数为奇数,则数据域填补一个额外的0字节。校验和算法:将所有的16位字按1的补码形式累加起来,取累加结果的补码。因此,当接收方执行同样计算时(包括Checksum域),结果应该是0。

紧急指针(urgent pointer)

占2个字节(16位)。仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。
当 URG = 1 时,发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。

选项(tcp options)

其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*4-20=40字节。选项部分的应用:

MSS最大报文段长度(Maxium Segment Size)

指明数据字段的最大长度,数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS值指示自己期望对方发送TCP报文段时那个数据字段的长度。通信双方可以有不同的MSS值。如果未填写,默认采用536字节。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中。

窗口扩大选项(Windows Scaling)

由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。

SACK选择确认项(Selective Acknowledgements)

用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机A发送报文段1、2、3,而主机B仅收到报文段1、3。那么此时就需要使用SACK选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用SACK需要两个功能字节。一个表示要使用SACK选项,另一个指明这个选项占用多少字节。描述丢失的报文段2,是通过描述它的左右边界报文段1、3来完成的。而这个1、3实际上是表示序列号,所以描述一个丢失的报文段需要64位即8个字节的空间。那么可以推算整个选项字段最多描述(40-2)/8=4个丢失的报文段。

时间戳选项(Timestamps)

可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。

NOP(NO-Operation)

它要求选项部分中的每种选项长度必须是4字节的倍数,不足的则用NOP填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和SACK之间用NOP隔开。

数据

无任何数据的TCP段也是合法的,通常用于确认和控制信息。





TCP通信的动作(切割,复原)

切割:按照合适传输的大小对数据流进行切割,最大报文段长度<64Kbytes;凡是:MTU-(IP头+TCP头)
复原:用报文段恢复复原起始数据流的字节次序
序号:排序、查错及数据流恢复复原



报文序号

根据数据流中的字节序号(流序号),报文序号为报文段中第一字节的流序号
如:流序号=x,长度=L的报文段,则:报文的序号为x,下一报文序号为x+L
序号特点:报文的次序关系;数据流的地位,更便于流的恢复复原;需较大的序号空间(32bit,4Gbyte);
例如:在一个报文中,序号为300,而报文中数占领100字节。下一个报文,其序号为400;



TCP可靠性的保证

超时重传:TCP每发送出一个报文段后,都会启动一个定时器,对目的端传回的确认信息进行确认计时,超时后便重传。
确认信号:当TCP收到一个来自TCP的报文段后,便会发送回一个确认信号。
检验和TCP将始终保持首部和数据的检验和,如果收到的报文段的检验和有差错,便将其丢弃,希望发送端超时重传。
重新排序:由于IP数据报的达到可能失序,因此TCP将会数据进行重新排序,以正确的顺序交给应用层。
丢弃重复:由于IP数据报有可能重复,因此TCP将会丢弃重复的数据。
流量控制:TCP连接的两端都有固定大小的缓冲区空间,TCP接受端只允许对端发送本端缓冲区能容纳的数据。TCP提供流量控制。在双方进行交互时,会彼此通知自己目前接收缓冲区最多可以接收的数据量(通告窗口),以此确保发送方发送的数据不会溢出接收缓冲区。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: