TCP Handshake

温故而知新,TCP协议学习已经是很久以前了,今天再温习一下。

TCP 是面向连接的,面向连接的意思是TCP要经过3次握手来建立连接,  TCP是全双工的, 两端可以独立收发packets, ,4次握手断开连接。

首先我们从TCP建立连接握手开始:

客户端与服务器建立握手的过程

1)客户端Host A发送TCP sync packet给HOST B,同时指定一个随机的sequence number X;

2) 服务器Host B接收到A的Sync packet;

3)服务器发送SYNC-ACK packet给客户端,同时把A的串号X+1赋值给ACK  number,同时指定一个随机的sequence number Y;

4)客户端接收到SYNC-ACK;

5)客户端发送SYNC packet给服务器,同时把B的串号Y+1赋值给ACK  number;

6)服务器端接收到SYNC;

到此TCP socket 连接建立起来了。

Diagram:

TCP Handshake_第1张图片


Synchronize 和 Acknowledge消息是通过TCP header里面的 SYNC和ACK bit来表示的。SYNC-ACK消息就是把SYNC和ACK 位全部设为1。

我们可以通过SYNC, SYNC-ACK, ACK消息来知道当前状态,正在打开连接,同步中还是已经建立连接。


当双方的通信终止的时候, 同样需要4次握手来关闭连接,关闭连接可以由双方中任何一方终止连接。

关闭连接的过程如下:

1)A是主动断开连接方, 把FIN位设为1,seq num u是通信过程中的A发送的字节数+1,此报文的tcp len为0,为TCP协议规定

2) 此时A连接状态为Fin-wait-1;

3)B收到Fin报文;

4)  B发送ACK报文确认FIN,ACK num是A的seq num u +1, 同时发送自己的seq num v,v是B发送所有字节数+1;

5)此时B处于Close Wait状态, 这个状态服务器B正在等待服务应用关掉连接;

6)Client A收到ACK报文;

7)Client状态改为FIN Wait 2,这个状态的时候, 从客户端A到服务端B的连接以及关闭, 客户端等待服务器关闭TCP连接。

8)服务器应用程序关闭了TCP 连接。

9)服务器端发送FIN-ACK报文。

10)服务器端状态改变为Last ACK,等待client 发送ACK。

11)客户端A收到FIN;

12)客户端A发送ACK到服务器端;

13)客户端A开启一个定时器,用来处理last ACK被丢失, 服务器重新发送FIN;

14)客户端等待服务器重新发送FIN 在time wait状态;

15)服务器接收到ACK;

16)服务器把连接置为close状态;

17)客户端time wait 定时器超时,客户端连接变为close状态;

Diagram:

TCP Handshake_第2张图片


Time Wait定时器有两个作用:

1) 确保B能够收到最后一个ACK。如果ACK报文丢失,B会超时重传FIN+ACK,A在Time Wait状态可以重新发送ACK,并且重置定时器。如果B一直收不到last ACK,B会一直处于Close Wait状态。通过定时器可以确保TCP的全双工连接终止。

2)让老的失效的packet在网络中失效,TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TCP连接的时 候,来自连接先前化身的重复分组已经在网络中消逝。

在建立连接的时候, 同时也协商MSS,MSS由TCP header中表示, 采用TCP双方中最小的MSS, MSS的计算方法为MTU - IP header - TCP header



引用:

本文参考附件的PDF及以下链接:

http://packetlife.net/blog/2010/aug/4/tcp-windows-and-window-scaling/

你可能感兴趣的:(网络)