TCP的报文段

作者:追风剑情 发布于:2024-11-25 19:48 分类:其他

  TCP在两台设备之间传送的数据单元称为报文段。TCP报文段由首部和数据两部分组成。报文段的起始是首部,其中前 20B 是固定部分,后面有4nB 是根据需要而增加的选项(n必须是整数,若不是整数则需加0填充,以确保TCP首部以32bit边界结束)。选项部分最多40B。即TCP报文段的首部大小是20~60B,如果没有选项,它是20B,而最多是60B。首部后面是从应用程序来的数据,数据部分的大小是0~65495B(65495=65535-20-20,其中第一个20B为IP的首部,第二个20B为TCP的首部)。无任何数据的TCP报文段是合法的,通常被用于确认和控制。TCP报文段既可以用来传送数据,也可以用来建立连接和应答(在一个连接建立或终止时双方交换的报文段仅有TCP首部)。TCP报文段的格式如图8-3所示。

11111.png

  首部固定部分各字段的含义如下:

  (1)源端口号和目的端口号。

  这两个字段各占16bit。分别标识发送这个报文段的应用程序的端口号和接收这个报文段的应用程序的端口号。即分别标识一个连接的两端的两个应用程序。一个端口号加上其主机的IP地址构成一个 48 bit 的惟一端点。源端点和目的端点合起来标识了一个连接。这些端口号用来将若干高层协议向下复用或将运输层协议向上分用。

  源端口号和目的端口号分别标识发送和接收这个报文段的应用程序的端口。

  (2)序列号(seq)。

  该字段占 32 bit。TCP 是面向字节流的。TCP把一个连接中发送的每一个数据字节都编上号。当 TCP 从进程收到数据字节时,就把它们存储在发送缓存中,并进行编号。编号不一定从0开始,而是随机地开始。TCP在0~232-1之间产生一个随机数作为第一个字节的编号。

  首部中的这个序号是指每一个报文段数据的第一个字节的编号。目的进程在知道数据块长度后也就可以确定这个报文段中最后一个字节的序号了。例如,在一个报文段中序号为301,而报文段中共有100B,即其最后一个字节的序号是400。那么在下一个报文段中其序号就是401。

  TCP的通信是全双工的。在每一个方向的编号是互相独立的。当连接建立时,每方使用随机数产生器产生初始序号ISN。通常一个连接中每一个方向的初始序号都是不同的。ISN随时间而变化,因此每个连接都将具有不同的ISN。

  序号是指本报文段数据的第1个字节的编号,它是从随机数产生器产生的数开始。

  (3)确认号。

  该字段占32bit。是期望接收的下一个报文段的第一个字节的序号,也就是期望接收对方的下一个报文段首部的序号字段的值。而不是指已经正确接收到的最后一个字节的序号。

  如果接收端正确地接收了对方发来的序号为n的报文段,它就把确认号定为n+1。例如,接收端正确地接收了一个报文段,其序号字段的值是2531,而数据长度是1000B,要表明序号在 2531~3530之间的数据均已收到,则确认号不是3530,而应为3531,这就是它期望收到的下一个字节的编号。这也正是TCP确认号是“累计的”概念。“累计的”表示,如果某一方使用X作为确认号,那么就表明它已经正确收到了一直到X-1的所有字节。应当注意的是,这并不表示这一方已经收到了X-1个字节,因为编号不一定从0开始,而是随机产生的。

  TCP的通信是全双工的。一个连接中每一个方向的确认号定义了这一方期望接收的下一个字节的编号。

  另外,TCP无法对一个报文段进行否认。例如,如果收到1025~2048字节的报文段,但它的校验和错,那么TCP接收端所能做的就是发回一个确认号为1025的确认报文。

  注意:确认号是指与本数据报文段反向流动的数据流,而序列号是指与本数据报文段同向流动的数据流。

  确认号是指期望接收的对方的下一个字节的序列号。而不是指已经正确接收到的最后一个字节的序列号。TCP 确认号是“累计的”。

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号