TCP编号系统
虽然TCP软件需要掌握正在传送的或已接收到的每一个报文段,但在报文段首部中并没有存放报文段编号的字段。实际上,在这个首部中由两个叫作序号和确认号的字段。这两个字段所指的都是字节的编号而不是报文段的编号。
字节号
TCP把在一个连接中要发送的所有数据字节(8位组)都编上号。两个方向的编号是相互独立的。当TCP接收来自进程的数据字节时,就把它们存储在发送缓存中,并为它们进行编号。编号不一定要从0开始。TCP选择 0~(2^32 - 1)之间的一个随机数作为第一个字节的编号。例如,若这个数字恰巧是1057,而要发送的数据总共有6000字节,那么这些字节的编号是从1057~7056.我们会看到,在流量控制和差错控制中都要用到字节编号。每条连接上传送的数据字节都被TCP编了号。编号从一个随机产生的数字开始。
序号
当字节都被编上号以后,TCP就给每一个要发送的报文段指派一个序号。每个报文段的序号就这个这个报文段中第一个数据字节的序号。
假设一条TCP连接要传送一个5000字节的文件。第一个字节的编号是10001.如果该数据用5个报文来发送,且每个报文段携带1000个字节的数据,那么每个报文段的序号分别是什么?下面给出每一个报文段的序号。
报文段的序号字段定义的是这个报文段包含的第一个数据字节所分配的编号。
当一个报文段同时携带了数据和控制信息(捎带)时,它使用一个序号。但如果报文段不携带用户数据,从逻辑上讲,它就不定义序号。序号字段总是存在的,但它的值是无意义的,不过某些仅携带控制信息的报文段还是需要一个序号,以便于接收方的确认。这些报文用于连接建立、连接终止和连接异常终止。这每一个报文段都要消耗一个序号,就好像它携带了一个字节的数据,但实际上是没有数据的。
确认号
TCP通讯是全双工的。当一条连接建立后,双方能同时发送和接收数据。通常双方从不同的起始号开始对字节编号。每一个方向上的序号表示的是该方向的报文段所携带的第一个字节的编号。双方还使用了确认号对各自收到的字节表示确认,不过这个确认号定义的是它期望接收的下一个字节的编号。另外,确认号是累积的,也就是说,他把收到的最后一个(完全完好)字节的编号上加1所得到的值宣布为确认号。这里术语累积的意思是指,如果某一方使用5643作为确认号,那么就表示它已经收到了从开始一直到编号5642的所有字节。请注意,并不是说这一方已经收到了5642个字节,因为第一个字节编号不一定是从0开始。