Chinaunix首页 | 论坛 | 博客
  • 博客访问: 332964
  • 博文数量: 32
  • 博客积分: 822
  • 博客等级: 准尉
  • 技术积分: 388
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-27 13:55
文章分类

全部博文(32)

文章存档

2019年(2)

2017年(4)

2016年(9)

2015年(1)

2014年(1)

2012年(2)

2011年(13)

我的朋友

分类: 系统运维

2016-03-18 16:38:14

    在TCP协议中,seq和ack字段的产生以及交互过程是如何工作的,下面的这段文字阐述的非常清楚了。
    虽然TCP软件需要掌握正在传送的或者已经收到的每一个报文段,但在报文段首部中并没有存放报文段编号值的字段。实际上,在这个首部中有两个叫做序号和确认号的字段。这两个字段所指的都是字节的编号而不是报文段的编号。
   字节号
    TCP把在一个连接中要发送的所有数据字节(八位组)都编上号,两个方向[发送和接收]的编号是相互独立的。当TCP接收来自进程的数据字节时,就把它们 存储在发送缓存中,并为它们进行编号。编号不一定要从0开始。TCP选择0 ~ (232-1)之间的一个随机数作为第一个字节的编号。例如,若这个数恰巧是1057,而要发送的数据总共有6000字节,那么这些字节的编号就是从1057~7056。我们将会看到,在流量控制和差错控制中要用到字节编号。
   每条连接上传送的数据字节都被TCP编了号,编号从一个随机产生的数据开始。
    序号
    当字节都被编上号以后,TCP就给每一个要发送的报文段指派一个序号。每个报文段的序号就是这个报文段中第一个数据字节的序号。
    报文段的序号字段值定义的是这个报文段包含的第一个数据字节所分配的编号
    当一个报文段同时携带了数据和控制信息(捎带)时,它使用一个序号。但如果报文段不携带用户数据,从逻辑上讲,它就不定义序号。序号字段总是存在的,但它的值是无意义的。不过某些公携带控制信息的报文段还是需要有一个序号,以便于接收方的确认。这些报文用于连接建立、连接终止和连接异常终止。这每一个报文段都要消耗一个序号,就好像它携带了一个字节的数据,但实际上是没有数据的。我们将会在讨论连接时再来详细讨论这个问题。
    确认号
    正如我们前面讨论过的,TCP的通信是全双工的。当一条连接建立以后,双方能同时发送和接收数据。通常双方从不同的起始号开始对字节编号。每一个方向上的序号表示的是该方向的报文段所携带的第一个数据字节的编号。双方还使用了确认号对各自收到的字节表示确认,不过这个确认号定义的是它期望接收的下一个字节的编号。另外,确认号是累积的,也就是说,它把收到的最后一个(安全完全)字节的编号加上1所得到的值宣布为确认号。在这里术语累积的意思是指,如果某一方使用5643作为确认号,那就表示它已经收到了从开始一直到编号为5642的所有字节。请注意,并不是说这一方已经收到了5642个字节,因为每一个字节的编号不一定是从0开始的。
    报文段中确认字段的值定义了某一方期望接收的下一个字节的编号
    确认号是累积的。
阅读(3288) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~