温故而知新,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:
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:
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/