1.前言
网络通信的实体是不同主机之间进程的通信,也就是端到端通信,其过程借助于TCP或者UDP协议,基于端口。
倘若利用TCP协议,则传输前有三次握手,传输后有三次挥手,是一个可靠传输。
倘若利用UDP协议,传输前不需要建立连接,对方收到后也不需要发送确认,是一个不可靠的传输,但是胜在消耗资源少,速度快。
2.三次握手
首先我们需要知道为什么要三次握手而不是两次。原因是为了防止之前传输过的请求连接的数据包延时到达服务器后,服务器再次创建新的连接而导致的错误。
如果我们只使用二次握手
,假设有这么一种情况,我们先发了一个syn包,这个包因为某种原因被阻塞到网络中,这时候我们又发送了一个syn包,这次收到了对方的ack+syn包,tcp连接已经建立。过了一会儿之前阻塞的syn包发送到了对方主机,对方主机又返回了一个ack+syn包,这时候又建立了一个tcp连接。但我们是只想建立一个tcp连接的,这时候出现了两个,浪费了资源。为了解决这种情况,因此就出现了tcp三次握手。
假设我们使用tcp三次握手,就可以避免这个情况,因为即使之前被阻塞的包被发送到了服务端,服务端返回了ack+syn包,但只要我们不发送最后的第三次握手也就是ack包,就不会建立连接,也就不会有资源的浪费,这就是tcp连接为什么是三次的原因。
3.四次挥手
通过四次挥手来结束tcp连接,也是有其原因的,我的理解是这个样子的:
- 第一次客户端发送fin包,告诉服务端,
我不会再给你传送数据了并且我想要断开连接。
- 第二次服务端发送ack包,告诉客户端,
这是我这边剩余要发送的数据,等发送完在关。
- 第三次服务端发送fin+ack包,告诉客户端,
我这边发送结束,可以中断连接了。
- 第四次客户端发送ack包,告诉服务端,
好的。