TCP序列号和确认号详解

转自:http://blog.chinaunix.net/uid-20665441-id-305478.html

1.  序列号和确认号的简介及作用

TCP协议工作在OSI的传输层,是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了传送数据包的顺序。顺序是用一个序列号来保证的。 响应包内也包括一个序列号,表示接收方准备好这个序列号的包。在TCP传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据包。另外,TCP通过数据分段中的序 列号来保证所有传输的数据可以按照正常的顺序进行重组,从而保障数据传输的完整。

2.  TCP的通讯过程

在TCP通讯中主要有连接的建立、数据的传输、连接的关闭三个过程!每个过程完成不同的工作,而且序列号和确认号在每个过程中的变化都是不同的。

2.1 TCP建立连接

TCP建立连接,也就是我们常说的三次握手,它需要三步完成。在TCP的三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另一端执行的是被动打开。

这里以客户端向服务器发起连接来说明。

1)  第1步:客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值,确认号是0;

2)  第2步:服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;

3)  第3步:客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。


详细解释为:
先把TCP协议的序列号搞清楚:
1、开始C端随机生成初始sequence(C),发到S,flag为syn (eg.Seq(C)=0)
2、S端回应C端,也随机生成初始sequence(S) eg. Seq(S)=0,ack=sequence(C)+1,表示收到C端的连接请求,flag为syn+ack(eg. Seq(s)=0, ack=1)
3 、C端回应S端,ack=sequence(S)+1,表示收到S端的连接回应,flag为ack (eg. ack=1)

至此三次握手建立,此后双方的序列号变化为:
刚开始任一方(不分C或S)的sequence=sequence(握手时)+1
至于next sequence是wireshark自己加上去的,其值为 n_sequence=此次发送包的sequence+TCP层以上负载的数据长度.也就是下次发包时该方将会使用的sequence值
5、同理任一方的ack=收到的对方的sequence+其TCP层以上负载的数据长度,也就是期待对方下一次发包所使用的sequence值


注意:因为一个SYN将占用一个序号,所以要加1。

初始序列号(ISN)随时间而变化的,而且不同的操作系统也会有不同的实现方式,所以每个连接的初始序列号是不同的。TCP连接两端会在建立连接时,交互一些信息,如窗口大小、MSS等,以便为接着的数据传输做准备。

MSS:Max segment size,最大分段大小的缩写,意为TCP数据包每次能够传输的最大数据分段,是TCP协议里的一个概念。MSS值所表示的是TCP报文的净荷数据大小。通过设置其值可以达到与设置MTU(以太网帧的Max transsion unit)一样的效果。
建立tcp连接的两端在三次握手时会协商tcp mss大小,具体如下: 
pc1发出syn报文,其中option选项填充的mss字段一般为1460,同样www server收到syn报文后,会发送syn+ack报文应答,option选项填充的mss字段也为1460;协商双方会比较syn和syn+ack报文中mss字段大小,选择较小的mss作为发送tcp分片的大小。通过比较,协商双方的tcp mss都是1460。 


RFC793指出ISN可以看作是一个32bit的计数器,每4ms加1,这样选择序号的目的在于防止在网络中被延迟的分组在以后被重复传输,而导致某个连接的一端对它作错误的判断。

2.2 TCP传输数据

在TCP建立连接后,就可以开始传输数据了。TCP工作在全双工模式,它可以同时进行双向数据传输。这里为了简化,我们只谈服务器向客户端发送数据的情况,而客户端向服务器发送数据的原理和它是类似的,这里便不重复说明。
服务器向客户端发送一个数据包后,客户端收到这个数据包后,会向服务器发送一个确认数据包。

传输数据的简要过程如下:

1)  发送数据:服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;

2)  确认收到:客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小
数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。

2.3 TCP关闭连接

前面我们提到,建立一个连接需要3个步骤,但是关闭一个连接需要经过4个步骤。因为TCP连接是全双工的工作模式,所以每个方向上需要单独关闭。在TCP 关闭连接时,首先关闭的一方(即发送第一个终止数据包的)将执行主动关闭,而另一方(收到这个终止数据包的)再执行被动关闭。

关闭连接的4个步骤如下: 

1)  第1步:服务器完成它的数据发送任务后,会主动向客户端发送一个终止数据包,以关闭在这个方向上的TCP连接。该数据包中,序列号为客户端发送的上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+该数据包所带的数据的大小; flag为[FIN,ACK]

2)  第2步:客户端收到服务器发送的终止数据包后,将对服务器发送确认信息,以关闭该方向上的TCP连接。这时的数据包中,序列号为第1步中的确认号值,而确认号为第1步的数据包中的序列号+1;flag为[ACK]

3)  第3步:同理,客户端完成它的数据发送任务后,就也会向服务器发送一个终止数据包,以关闭在这个方向上的TCP连接,该数据包中,序列号为服务器发送的上一个数据包中的确认号值,而确认号为客户端发送的上一个数据包中的序列号+该数据包所带数据的大小; flag为[FIN,ACK]

4)  第4步:服务器收到客户端发送的终止数据包后,将对客户端发送确认信息,以关闭该方向上的TCP连接。这时在数据包中,序列号为第3步中的确认号值,而确认号为第3步数据包中的序列号+1;flag为[ACK]

注意:因为FIN和SYN一样,也要占一个序号。理论上服务器在TCP连接关闭时发送的终止数据包中,只有终止位是置1,然后客户端进行确认。但是在实际的TCP实现中,在终止数据包中,确认位和终止位是同时置为1的,确认位置为1表示对最后一次传输的数据进行确认,终 止位置为1表示关闭该方向的TCP连接。


TCP数据报包括:
14字节Ethernet报头:
 (DMAC:48bit, SMAC:48bit, protocol type:2Bytes, eg.IP(0x0800))

20字节的IP报头:

struct IPHeader { 
    BYTE h_len:4;          // Length of the header in dwords:高4位
    BYTE version:4;        // Version of IP :低4位
    BYTE tos;              // Type of service                 1Bytes
    USHORT total_len;      // Length of the packet in dwords  2Bytes 
    USHORT ident;          // unique identifier               2Bytes
    USHORT flags;          // Flags                           2Bytes
    BYTE ttl;              // Time to live,                   1Bytes
    BYTE proto;            // Protocol number (TCP, UDP etc)  1Bytes
    USHORT checksum;       // IP checksum                     2Bytes
    ULONG source_ip;       // 32bit                           4Bytes
    ULONG dest_ip;         // 32bit                           4Bytes
};

20字节的TCP报头:


和4字节的FCS(1018-14-20-20-4=960)

Note:一个EthernetII帧至少包含64Bytes(DMAC:destinationMAC+SMAC:sourceMAC+Data+FCS:帧校验和)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值