三次握手
图形展示
形象的比喻
为啥需要三次?
成功建立连接通道之后,客户端就和服务器进行数据传输了。在数据传输的过程中,客户端与服务器都是通过数据包进行传送。通过数据包进行传送就会产生一些问题。比如说传输过程中出现数据包丢失或者发送的数据包的顺序与接收的数据包的顺序不一样。
TCP/IP在数据传输过程中就起到了很不错的作用。
当客户端与服务器建立连接之后,TCP/IP协议就会建立一个发送缓冲,为每个字节创建一个序列号(起初建立的时候序列号从0开始)
- 发送的内容会占用发送缓冲里的字节序列,发送的报文包括起始序列号和数据内容长度以及数据内容本身;接收端则回复
ACK=序列号+长度=下一包的起始序列号
;这样对于连续的数据包接收端只需要回复一个ACK即可。 - 因此有这样的技术,对于数据就可以切割分块进行发送了。接收端只需要对发送报文里的序列号和长度对接收到的数据包进行重组(这样就解决了数据包接收乱序问题)
- 如果有丢失的数据包,接收端只需要向发送端回复ACK的内容(即丢失数据包的起始序列号)让发送端重发即可
四次挥手
当客户端想要断开连接的时候,客户端就向服务端发送FIN包
客户端发送完成后进入等待状态FIN-WAIT-1(第一次挥手)
服务端接收到FIN包,就向客户端发送ACK包,服务端进入CLOSE-WAIT(第二次挥手)
但是此时客户端和服务单还可以接收和发送数据包。待服务端
发送完未发送的数据包给客户端后,再发送一个Fin包进入最后确认状态(第三次挥手)
接收到服务端发送过来的FIN包,客户端回复ACK包确认关闭连接后,客户端
进入延时等待关闭状态。而接收到客户端发过来ACK包的服务端时
直接关闭服务端的连接
为什么要延时等到关闭?
如果服务端没有接收到客户端发送过来的ACK时,就会继续发一个FIN包
此时客户端接收到FIN包后重新向服务端发送ACK包并刷新等待时间
客户UDP协议就直接将数据包进行打包经过网卡传输
TCP | 稳定可靠 | 文件传输 | 邮件传输 | 网页浏览 |
---|---|---|---|---|
UDP | 速度快(实时性强) | 域名查询 | 电话 | 视频直播 |
参考
B站