序号占4字节。序号范围是[0,2^32-1],共2^32 (4 284 967 296)个序号。
序号增加到2^32-1后,下一个序号又回到0.也就是说,序号使用mod 2^32运算。
TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。
首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
Eg. 一报文段的序号字段值是301,而携带的数据共有100字节。
这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400.
显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401.这个字段的名称也叫做“报文段序号”
三次握手的过程:
首先由Client发出请求连接即 SYN=1 ACK=0
TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=client_isn
然后 Server 进行回复确认
即 SYN=1 ACK=1 seq=server_isn(图里画错了), ack=client_isn+1 (seq序号 ack确认序号)
再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=client_isn+1, ack=server_isn+1.
然后连接建立.
ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。
对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
字段名称 | 报文1(SYN) | 报文2(SYN+ACK) | 报文3(ACK) | 报文4(数据) | 报文5(确认) |
序号(Sequence Number) | 1000 | 2000 | 1001 | 2001 | 1061 |
确认序号(Ack Number) | 0 | 1001 | 2001 | 1001 | |
ACK | 0 | 1 | 1 | 1 | 1 |
SYN | 1 | 1 | 0 | 0 | 0 |
TCP建立连接
TCP建立连接,也就是我们常说的三次握手,它需要三步完成。
在TCP的三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另一端执行的是被动打开。
这里以客户端向服务器发起连接来说明。
1)
2)
3)
该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。
注意:因为一个SYN将占用一个序号,所以要加1。
-------------------------------传输数据的简要过程如下:
1)
2)
数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
--------------------------------------
序列号是上一个收包的确认号不变
确认号是上一个收包的序列号+上一个收包的数据段的大小(1001+60)
[练习题]
下列TCP连接建立过程描述正确的是:C
A. 服务端收到客户端的SYN包后等待2*ml时间后就会进入SYN_SENT状态
B. 服务端收到客户端的ACK包后会进入SYN_RCVD状态
C. 当客户端处于ESTABLISHED状态时,服务端可能仍然处于SYN_RCVD状态
D. 服务端未收到客户端确认包,等待2*ml时间后会直接关闭连接
解析:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
因此,根据第二次握手,A、B错误。
D、服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。所以D错误。
服务器端首先执行 LISTEN 原语进入被动打开状态( LISTEN ),等待客户端连接;
1.当客户端的一个应用程序发出 CONNECT 命令后,本地的 TCP 实体为其创建一个连接记录并标记为 SYN SENT 状态,然后给服务器发送一个 SYN 报文段;
2.服务器收到一个 SYN 报文段,其 TCP 实体给客户端发送确认 ACK 报文段同时发送一个 SYN 信号,进入 SYN RCVD 状态;
3.客户端收到 SYN + ACK 报文段,其 TCP 实体给服务器端发送出三次握手的最后一个 ACK 报文段,并转换为 ESTABLISHED 状态;
4.服务器端收到确认的 ACK 报文段,完成了三次握手,于是也进入 ESTABLISHED 状态。
在此状态下,双方可以自由传输数据。
当一个应用程序完成数据传输任务后,它需要关闭 TCP 连接。假设仍由客户端发起主动关闭连接。
1.客户端执行 CLOSE 原语,本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认(进入状态 FIN WAIT 1 );
2.服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段,进入 CLOSE WAIT 状态;
3.客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态,此时连接在一个方向上就断开了;
4.服务器端应用得到通告后,也执行 CLOSE 原语关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 报文段,并进入 LAST ACK 状态,等待最后一个 ACK 确认报文段;
5.客户端收到 FIN 报文段并确认,进入 TIMED WAIT 状态,此时双方连接均已经断开,但 TCP 要等待一个 2 倍报文段最大生存时间 MSL ( Maximum Segment Lifetime ),确保该连接的所有分组全部消失,以防止出现确认丢失的情况。当定时器超时后, TCP 删除该连接记录,返回到初始状态( CLOSED )。
6.服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录,返回到初始状态( CLOSED )。