1、什么是三次握手
最简单的理解
三次握手就是在建立一个TCP连接时,需要客户端和服务器总共发送3个包
多说一点
- 第一次握手就是客户端给服务器端发送一个报文
- 第二次服务器收到报文之后应答给客户端一个报文
- 第三次就是客户端收到报文后再给服务器发送一个报文 三次握手就成功了。
能说一下具体流程吗?
刚开始客户端处于Closed的状态,服务端处于Listen状态
第一次握手:
- 客户端给服务器端发送一个报文
- 指明客户端的初始化序列号
- 此时客户端处于SYN_SEND状态
第二次握手:
- 服务器收到客户端的SYN报文之后响应给客户端自己的SYN报文
- 指定自己的初始化序列号ISN
- 将客户端的ISN + 1作为的值,表示自己已经收到了客户端的SYN
- 此时服务器处于SYN_REVD的状态
第三次握手:
- 客户端收到SYN报文之后会发送一个ACK报文给服务器
- 将服务器的ISN + 1作为ACK的值,表示已经收到了服务端的SYN报文
- 此时客户端处于ESTABLISHED状态
此时,双方已建立起了连接。
最后,发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的端执行被动打开
配合图示效果更佳
总结一下
三次握手实质上是:
- 连接服务器指定端口,建立TCP连接
- 同步连接双方的序列号和确认号,交换TCP窗口大小信息
2、为什么要进行三次握手
为了确认双方的接收能力和发送能力是否正常以及指定自己的初始化序列号,为后面的可靠性传送做准备。
第一次握手:
- 客户端:客户端发送能力正常
- 服务端:客户端发送能力正常,服务端接收能力正常 第二次握手:
- 客户端:客户端接收能力正常,服务端发送能力正常
- 服务端:服务端发送能力正常 第三次握手:
- 服务端:客户端接收能力正常
3、两次握手会怎么样?
- 第一次握手:客户端发出第一次连接请求,服务端因网络延迟没接收到
- 第一次握手:客户端发出第二次连接请求,服务端接收到了
- 第二次握手:服务端接收到了第二次连接请求并确认 建立了连接
- 第二次握手:服务端接收到了第一次连接请求并确认 建立了连接
此时客户端忽略服务端发来的确认,也不发送数据,则服务端一直等待客户端发送数据,浪费资源(创建连接会导致空间浪费及端口消耗)
注释
①SYN报文:
- Synchronize(同步)报文,TCP三次握手过程中的首个报文
- 当 SYN = 1 的时候,表明这是一个请求连接报文段。
②ISN:初始化序列号(Initial Sequence Number)
③ACK:确认字符(Acknowledge character)
参考
[1]:三次握手:面试官,不要再问我三次握手和四次挥手 - 知乎 (zhihu.com)
[2]:报文结构:理解 TCP(二):报文结构 - 简书 (jianshu.com)