英文缩写含义
client :主动发起连接或者断开请求的host
server:非主动发起连接或断开请求,只是响应的host
SYNbit : 连接请求标志位 当SYNbit = 1;表示该包是一个连接请求
FINbit : 断开请求标志位 当FINbit = 1时,表示该包是一个断开请求
ACKbit : 应答标志位包 当ACKbit=1 表示ACKnum字段有效
ACKnum: 应答的数字,是一个整数序列
seq : 一个整数序列
x:client的初始序列(ISN)
y: server的初始序列(ISN)
每一个台tcp机器都会通过ISN算法生产初始序列,用于相互标识。x或者y保存在包头的序列号(Sequence Number)字段里
URGbit 紧急字段标志位 当URGbit=1表示报文字段中有紧急数据,应当优先传递
PSHbit 推送标志位 当PSHbit=1时,则报文段会被尽快地交付给目的方,不会对这样的报文段使用缓存策略。
tcp 头结构:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ TCP Header Format
三次握手
如上图,三次握手分别为
1、第一次握手(SYNbit = 1, seq = x)
客户端像服务端发一个SYN位设为1的包,指明想要连接到服务端哪个端口,并携带客户端的初始序列号x 。 发完包之后客户端状态变为SYN SENT,服务端收到包后状态变为
SYN RCVD
2、第二次握手(SYNbit = 1,ACKbit = 1,ACKnum = x+1, seq= y)
服务器回复一个确认包,SYN位设为1,seq = y为客户端的初始序列号;ACK位设为1,ACKnum 设置为x+1,(这样,客户端收到后知道这个回复是正确的)。 客户端收到服务器的回复后状态变为ESTAB (established)
3、第三次握手 (ACKbit = 1,ACKnum = y +1)
客户端发送一个确认包,ACK位设为1,ACKnum 设置为y+1,(这样,服务端收到后知道这个回复是正确的),服务端收到后状态变为ESTAB(established)
四次挥手
如图,四次挥手过程:
1、第一次挥手(FINbit = 1,seq = x)
客户端向服务端发送一个请求断开的包,FINbit = 1,seq = x ,发送后客户端状态由ESTAB变成 FIN_WAIT_1 ;服务端收到之后,状态变为CLOSE_WAIT
2、第二次挥手(ACKbit = 1,ACKnum = x+1)
服务端向客户端发送一个确认包,ACKbit = 1,ACKnum = x+1(这样,客户端收到后,知道是正确的回复);服务端发送完确认包后,做关闭连接的准备;客户端收到后,状态变FIN_WAIT_2
3、第三次挥手(FINbit = 1,seq = y)
服务端做完了关闭连接的准备,状态变为 LAST_ACK并发送出最后一个包。FINbit = 1,seq = y; 当客户端收到该包之后,状态置为TIMED_WAIT,等待固定时间后,状态自动变为 CLOSED
4、第四次挥手(ACKbit = 1,ACKnum = y+1)
客户端向服务端发送最后一个确认包。让服务端也把状态变为CLOSED。 至此,正常断开了连接。
参考文档