16-tcp首部分析一

1. tcp首部格式

  在分析tcp首部之前,先来看一下tcp报文段格式,tcp协议能够实现数据分段传输,可靠传输,流量控制,网络拥塞避免等功能,tcp协议的首部比udp协议的首部字段多,因此tcp协议功能比udp协议要复杂很多,且首部长度也不固定。

  tcp协议虽然是基于字节流数据的,但是tcp传输的数据单元却是报文段,一个tcp报文段分为首部和数据两部分,tcp协议的全部功能都体现在首部中的字段里,所以我们想要掌握tcp的工作原理,还是很有必要学习tcp首部中的字段。

这里写图片描述
图1-tcp报文段格式

  上图展示了tcp首部中的字段,可以看出tcp数据报在传输到网络层之前需要封装成IP数据报的格式,就是把整个tcp报文段封装成IP数据部分,并在前面加上IP的首部,后面我们分析tcp首部中的字段都是通过这张图来分析的。

  tcp的首部由两部分组成:20字节的固定首部和选项(长度可变,最大40字节),填充。

2. 源端口和目的端口

端口也有几种分类:
  熟知端口(著名端口):0-1023,由IANA指派和控制
  注册端口:1024-49151,对于注册端口IANA不指派也不控制,但是必须注册
  动态端口(短暂端口):49152-65535,IANA不指派也不控制,无须注册

  源端口和目的端口字段各占2字节。端口是运输层与应用层的服务接口。用于传输层tcp协议的复用和分用功能都要通过端口才能实现,而tcp数据段报文中使用的源端口是属于动态端口,也称短暂端口,目的端口是使用的著名端口。

  源端口占用16个bit位,端口范围是:49152-65535,(也就是2的16次方减1 ),目的端口也是占用16个bit位,但是占用的端口范围是0 - 1023

3. 序号

  序号字段——占 4 字节(32bit位)。这个序号和我们前面所说的序号是一个道理(15-传输层协议和应用层协议中的第4小节:关于字节号和序号),tcp是面向字节流数据的,因此tcp 连接中传送的数据流中的每一个字节按顺序编号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

  这里提一下:在客户端和服务端建立tcp连接的三次握手时,双方发送的第一个报文(通常是SYN报文)也会携带一个序号,这个序号称为初始序号(Initial Sequence Number),一般简称为ISN

  注意:在抓包过程中,wireshark抓包工具可能会对序号进行处理,以相对序号表示方便我们分析数据报,但是数据报实际的序号是以绝对序号来表示的,通常是一个很大的值。

4. 确认号

  确认号字段——占 4 字节,是期望收到对方的下一个报文段数据的第一个字节的序号。

  另外,确认号是累积的,也就是说,这个确认号是把收到的字节数据中最后一个字节号+1所得到的值。而累积的意思就是,如果对方发送了一个确认号为1200,这表示对方已经收到了从开始字节号到1199(1200 - 1)字节号的所有字节,并不是说收到了1200个字节数据。(因为前面我们说过这个字节号是系统随机编号的,所以这个开始字节号也不一定是从0开始的)

这里写图片描述
图2-确认号

  在上图中,A计算机给B计算机发送了两个数据包,然后B计算机收到这两个数据包会进行重组排列得到这前200字节,并通过这两个数据包中的序号和数据包中数据部分的长度得出确认号为201(累积确认),然后B计算机将201这个确认号发送给A计算机,告诉A计算机可以开始发送第201个字节的数据了。于是A计算机发送了第三个数据包,且该数据包中的tcp首部中序号为201。

注意:B计算机在发送的确认数据包中,没有数据部分,只有tcp首部,且首部中的确认号字段值为201。

  通过这点可以知道,假设B计算机发送的确认号为N,那么序号为N-1前的所有数据都已经收到了。

  通过序列号,确认号,数据分组长度等字段,接收方对发送方的数据进行实时反馈,在不丢包的情况下,一般根据 ACK(n+1)=Seq(n)+Len(n) A C K ( n + 1 ) = S e q ( n ) + L e n ( n ) 方式进行可靠确认(确认号 = 系统随机产生的序列号 + 数据分组长度),若对方返回的ACK小于Seq( n ) + Len( n ),则说明数据报丢失,此时发送方需要进行数据重传。

  简单来说,tcp协议能够实现可靠传输,就是接收方在收到数据包后,会向发送方发送一个确认号,表明自己已经收到数据,同时告知发送方发送下一个数据包从第几个字节号开始发送。



总结:序号和确认号这两个字段在tcp协议中非常重要,特别是后面的tcp协议学习中基本上会一直提到这两个字段。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值