TCP三次握手和四次挥手

来源:互联网 发布:成功瘦下来 知乎 编辑:程序博客网 时间:2024/06/07 08:08

英文缩写含义

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。 至此,正常断开了连接。

参考文档

tcp三次握手和四次挥手详解

tcp head format

原创粉丝点击