三次握手
客户端向服务器发送请求 之前需要建立三次握手 这个握手是怎样建立的呢?
次数 | 客户端 | 服务端 | 报文重点 | 具体报文 |
---|---|---|---|---|
第一次 | 客户端发出一个小的包 要求建立连接 你能收到我的信息吗 | 接收数据 | SYN | 包里是SYN=1 seq=x 包中不含数据 |
第二次 | 接收数据 | 服务端礼貌返回一个数据包 收到包确认信息 我能收到信息 你试试能不能收到我的信息 | SYN+ACK | 包里是SYN=1 ACK=1 seq=y ack=x+1 包中不含数据 |
第三次 | 客户端发送我收到确认的信息 我能收到你发送的信息 | 服务端接收数据 | ACK | ACK=1 seq=x+1 ack =y+1 包中不含数据 |
第三次主要是为了让服务端确认 服务端发送的信息客户端是可以接收的
只有经过三次握手之后才能确认:服务端发送和接收数据都没问题 ,客户端发送接收数据都没问题
注意:三次发送都是不含请求数据的小包 若发送没回复 会进行重试
三次握手之后发生
双方开辟资源 各有一个发送队列和接收队列
四次挥手
次数 | 客户端 | 服务端 | 报文重点 | 具体报文 |
---|---|---|---|---|
第一次 | 客户端发出一个小的包 我要跟你分手 | 接收数据 | FIN | FIN=1 seq=u |
第二次 | 接收数据 | 服务端返回一个数据包 收到包确认信息 哼 我知道了 我还不确认要不要分手 | FIN+ACK | ACK=1 seq=v ack=u+1 |
第三次 | 接收数据 | 服务端再发送一个数据包 确认自己也要断开连接 我也要分手 离就离呗 | FIN | FIN=1 ACK=1 seq=w ack=u+1 |
第四次 | 发送数据 代表接收到断开的请求 好嘞 等的就是你这句话 | 接收数据 | FIN | ACK=1 seq = u+1 ack =w+1 |
为什么要建立四次?
因为双方建立连接时开辟了资源
如果不确认对方要断开连接就释放资源 但是当对方不想断连接时 连接已经不复存在了
建立连接网络断开会发生什么
双方建立连接后 是无感知的 会有一个确认心跳机制 发送报文 若确认没有心跳了 连接就会断开