为什么需要三次握手
第一次: 客户端给服务器发送syn报文
第二次: 服务器收到syn报文后, 会应答一个syn+ack报文
第三次: 客户端收到syn + ack报文, 会回应一个ack报文, 至此三次握手建立
第一次时, 客户端发送网络包, 服务器得到结论, 服务器接收能力和客户端发送能力正常. 第二次服务器发包, 客户端收到后得到结论, 客户端收发能力正常, 服务器收发能力正常, 但服务器还不知道. 所以第三次客户端发包给服务器接收后, 服务器才能确定双方都能正常接收网络包
刚开始时客户端处于closed状态, 服务端处于listen状态
1、第一次握手:客户端给服务器发一个syn报文, 并指明客户端的初始化序列号ISN(c),此时客户端处于syn_send状态
2、第二次握手:服务器接收到syn报文后,会以自己的syn报文作为应答 ,并且也是制定了自己的初始化序列号ISN(s),同时会把同时会把ISN + 1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN_RCVD的状态
3、第三次握手:客户端收到SYN报文后,会发送一个ACK报文,也一样把服务器ISN + 1作为ACK的值, 表示已经接受了服务器SYN报文,此时客户端处于established状态
三次握手的作用
确认上方接受能力、发送能力是否正常
指定自己的初始化序列号,为后面的可靠传输做准备
1、(ISN)是固定的吗
三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number),以便让对方知道接下来接受数据如何按照序列号组装数据。ISN是随机生成的,否则攻击者很容易猜出
2、什么是半连接队列
服务器第一次接受到客户端的syn后会处于SYN_REVD状态,会将请求连接放在一个队列里,称为半连接队列
三次握手前两次不能携带数据,第三次可以
四次挥手
开始时双方都处于establised状态,客户端先发起请求关闭
1、第一次挥手:客户端发送一个fin报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态
2、第二次挥手:服务端收到FIN后,会发送ACK报文,且吧客户端序列号值+1