TCP,UDP的报头详解

本博客借鉴谢希仁第六版《计算机网络》的第九章

TCP报头 TCP,UDP的报头详解_第1张图片

(1)源端口和目的端口

各占2个字节,分别写入源端口号和目的端口号,TCP的分用功能是通过端口实现的。

(2)序号

占4个字节。序号范围是[0,2^32-1],共2^32(即4282967296)个序号,序号增加到2^32-1后,下一个序号就回到0,也就是说序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传输的字节流中的每一个字节都是按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就说明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400.显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401.这个字段的名称也叫做“报文段序号”。

(3)确认号

占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501-700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中确认号置为701。请注意,现在的确认号不是500,也不是700,而是701.

总之,应当记住:若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

由于序号字段有32位长,可对4GB(即4千兆字节)的数据进行编号。在一般情况下,可保证当序号重复使用时。旧序号的数据早已通过网络到达终点了。

(5)数据偏移

占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始位置有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但请注意,“数据偏移”的单位长度是32位字(即以4字节长的字位计算单位)。由于4位二进制数能够表达的最大十进制数为15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)

(6)保留

占6位,保留为今后使用,但目前应置为0。下面有6个控制位说明报文段的性质,它们的意义见下面的(7)-(12)。

(7)紧急URG(URGent)

当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不是按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但是后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令(Control+c)。如果不使用紧急数据,那么这两个字符才被交付到接受方的应用进程。这样做就浪费了许多时间。

当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据,这是要与首部中紧急指针字段配合使用。

(8)确认ACK(ACKnowledgment)   仅当ACK=1是确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1

(9)推送PSH(PuSH)  当两个应用进程进行相互交互的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收端TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付给接收应用程序,而不再等到整个缓存都填满了后在向上交付。

虽然应用程序可以选择推送操作,但推送操作还很少使用。

(10)复位RST(ReSeT)   当RST=1时,表明TCP连接中出现较为严重的差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可以称为重建位或重置位。

(11)同步SYN(SYNchronization)    在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接报文请求段。对方若是同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接收报文。

(12)终止FIN(FINis,意思是“完”、“终”)   用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

(13)窗口

占2个字节。窗口值是[0,2^16-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确定号算起,接收方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置为其发送窗口的依据。

例如,设确认号是701,窗口字段是1000。这就表明,从701号算起,发送次报文段的一方还有接收1000个字节数据(字节序号是701-1700)的接收缓存空间。

总之,应当记住,窗口字段明确指出了现在允许对方发送的数据量。窗口值是经常在动态变化着。

(14)校验和

占2个字节。校验和字段检验的范围包括首部和数据这两个部分。和UDP用户数据报一样,在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式与UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6),把第5字段中的UDP长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算校验和。若使用IPv6,则相应的伪首部也要改变。

(15)紧急指针

占2个字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此紧急指针指出来紧急指针的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。

(16)选项

长度可变,最长可达49字节。当没有选项时,TCP的首部长度是20字节。

UDP报头

TCP,UDP的报头详解_第2张图片

用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,有四个字段组成,每个字段的长度都是两个字节。各字段意义如下:

(1)源端口      源端口号。在需要对方回信时选用。不需要时可全用0。

(2)目的端口       目的端口号。这在终点交付报文时必须要使用到。

(3)长度      UDP用户数据报的长度,其最小值是8(仅有首部)。

(4)校验和     校验UDP用户数据报在传输中是否有错,有错就丢弃。

你可能感兴趣的:(Linux学习)