三次握手,四次挥手流程
1,首先了解TCP头部的序列号,确认号,几个标记位(SYN,FIN,ACK,RET)
- 序列号:在初次建立连接的时候,客户端和服务端都会随机初始化一个序列号(解决网络包乱序)
- 确认号:表示接收端告诉发送端,对上一个数据包已经成功接收(解决网络包丢失)
- 标记位:SYN为1时,表示希望创建连接,FIN为1时,表示希望断开连接,ACK为1时,表示确认号字段有效,RST为1时,表示TCP连 接出现异常,需要断开
2,三次握手
- 目的:确认通信双方的序列号,建立连接
- 过程:
1.最开始的时候,客户端和服务端同处于CLOSE状态,服务器主动监听某个端口,处于LISTEN状态,客户端随机生成出序列号(client_isn),并把标志位设置成SYN(表示希望创建连接),然后把报文发送给服务端,此时客户端进入SYN_SEND状态
2.服务端接收到请求后,自己也初始化序列号(server_isn),在确认号字段填上client_isn+1(相当于告诉客户端已经收到发过来的序列号了) ,并且把SYN,ACK都设置为1,然后服务端进入 SYN_REVD状态
3.客户端接收到报文后,通过 确认号可以知道服务端已经接收到自己的序列号了,并且收到服务端的序列号,此时客户端要告诉服务端自己已经收到它的序列号,所以会在确认号字段上填写sever_isn+1,并且标记位ACK为1,然后进入 ESTABLISHED状态,服务端接收到后也进入ESTABLISHED状态 - 总结:就是双方都把自身的序列号发给对方,看对方能不能接收到。确认可以,就能正常通信(双方都有可以接收和发送的能力)
- 问题:
1.能否两次?答:不行,服务端无法确认自己的序列号是否被客户端接收到
2.序列号为什么是随机生成的? 答:一方面为了安全性,随机ISN能够避免非同一网络的攻击,另一方面可以让通信双方能够根据序号将不属于本连接的报文段丢弃。
3.建立连接的过程中,中途丢失怎么办?答:会超时重传
3,四次挥手
- 目的:断开连接
- 过程:拿客户端主动断开连接来说
1.客户端发送FIN报文给服务端,进入FIN_WAIT_1状态
2.服务端收到后,回复ACK报文给客户端(表示已经收到),进入CLOSE_WAIT状态,客户端收到后进入FIN_WAIT_2状态
3.服务端可能还有数据没有传输完,等到自己传输完后会发送FIN报文给客户端,然后进入LAST_ACK
4.客户端收到FIN报文后,回应ACK报文,进入TIME_WAIT状态,服务端收到ACK后,进入CLOSE状态,客户端在TIME_WAIT等待2MSL后,也进入CLOSE状态 - 总结:就是客户端先发起FIN(第一次),服务端收到后回复收到(第二次),并等自己传输完后主动再发FIN(第三次),客户端收到后并回复进入关闭状态(第四次),服务端收到回复进入关闭状态
- 问题:
1.TIME_WAIT状态干什么用的(等待2MSL)?MSL到底是多久?答:主要有两个原因,第一个是保证最后得ACK报文接收方一定能收到(收不到会重发FIN报文),第二个是确保在创建新连接的时候,先前的网络中的残余数据都丢失了。MSL是指报文的最长生存时间,固定是1MSL是两分钟,实际30S,1Min都有使用。
2.如果TIME_WAIT状态时间长一点会有什么危害,如何解决?答:TIME_WAIT只会出现在主动发起关闭的一方,危害是会占用内存资源和端口,毕竟需要等待。解决可以设置LInux参数。
网友评论