TCP、UDP与IP首部

1、TCP首部

1、TCP虽然是面向字节的,但传输的时候数据单元却是报文段,一个TCP报文段分为首部和数据两部分,TCP的首部前20个字节是固定的,后面的4n个字节根据需要来增加,因此TCP报文最小的长度为20字节。

引用一张图
TCP、UDP与IP首部
各字段含义如下:

  • 1、源端口和目的端口:顾名思义,各占两个字节;
  • 2、序号,占4个字节,范围是0-2^ 31 -1,序号采用的是 mod 2 ^ 32,当到达最大之后会再次从0开始,这个序号是用来标识报文段对应的字节的开始和结束范围,例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。
  • 3、确认号,占4个字节,表示希望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。注意,现在确认号不是501,也不是700,而是701。
    若确认号为= N,则表明:到序号N-1为止的所有数据都已正确收到
  • 4、数据偏移,占4位,指出TCP报文首部长度,因为首部中还存在不确定的选项部分,因此数据偏移是必要的,由于数据偏移占四位,最大表示为2^4 - 1=15,由于数据偏移的单位是32位的,也就是4字节的字为单位,因此,TCP报文长度最大为60字节,也就是说选项部分最大为40字节。
  • 5、保留,占6位,为今后使用,置为0。
  • 6、下面6位为控制位:

URG,置1时表示报文段中有紧急数据,需要尽快发送,表示数据的高优先级,此时发送方的TCP会把紧急数据插入到本报文段的最前面,而在紧急数据的后面仍是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
ACK,确认,当ACK = 1时确认号字段才有效,ACK = 0确认号无效,在TCP建立连接后都要把ACK置为1。
推送PSH,在两个应用进行交互时,如果希望键入一个字符后希望立即得到相应时就可使用此控制位,在这种情况下,TCP采用push操作,将PSH置为1,并立即创建一个报文段发送出去,而接收方接收到这个PSH为1的报文就会尽快完成交付,而不必等到缓冲区满。
复位 RST,当RST = 1时,表明TCP连接中出现了严重的错误,如主机崩溃或其他原因,必须释放连接再重新建立连接,RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
同步 SYN ,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对*同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
终止 FIN,用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

  • 7、窗口,占2字节。窗口值是【0,2^16-1】之间的整数。窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。(考虑滑动窗口)。
    例如,发送了一个报文段,其确认号是701,窗口字段是1000.这就是告诉对方:“从701算起,我(即发送方报文段的一方)的接收缓存空间还可接受1000个字节数据(字节序号是701~1700),你在给我发数据时,必须考虑到这一点。” 总之:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化
  • 8、校验和,占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。
  • 9、紧急指针,占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。

注意:TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Szie)。注意MSS这个名词含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度”。

为什么要规定一个最大报文长度MSS呢?这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。

因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。

摘自:TCP报文段的首部格式

2、UDP首部

引用一张图
TCP、UDP与IP首部
1、源端口和目的端口分别占16位;
2、长度,UDP数据报的长度,以字节为单位,包括首部的8个字节在内,因此长度最小为8;
3、校验和,放防止在传输过程中出错。

3、IP首部

IP数据报首部最小位20字节,最大位60字节,最小时只有固定部分,下面引用一张图
TCP、UDP与IP首部

  • 1、版本,占4位,包含创建数据报所用的IP协议的版本信息。
  • 2、首部长度,IP首部的最大长度位15x4=60字节,数据报首部长度必须是4的整数倍,可能需要在填充字段中填0来保证。最常见的首部长度时20字节,字段值位5。
  • 3、TOS,指明应当如何处理数据报。
  • 4、总长度,占16位,表示以字节为单位的整个数据报的长度,最大位2^16 - 1个字节。
  • 5、标识,16位;用于标识IP数据报,如果因为数据链路层帧数据段长度限制(也就是MTU,支持的最大传输单元),IP数据报需要进行分片发送,则每个分片的IP数据报标识都是一致的。
  • 6、标志位,3位,但目前只有2位有意义;最低位为MF,MF=1代表后面还有分片的数据报,MF=0代表当前数据报已是最后的数据报。次低位为DF,DF=1代表不能分片,DF=0代表可以分片。
  • 7、片偏移,13位,指出本数据报中数据相对于最初始数据报中数据的偏移量。
  • 8、TTL,生存时间,占8位,用于指明数据报在互联网系统中允许保留的时间(以秒为单位)。
  • 9、协议 ,8位;代表上层传输层协议的类型,1代表ICMP,2代表IGMP,6代表TCP,17代表UDP。
  • 10、校验和,16位,用于验证数据完整性,计算方法为,首先将校验和位置零,然后将每16位二进制反码求和即为校验和,最后写入校验和位置。
  • 11、源IP地址和目的IP地址
  • 12、IP选项,不常用。