比起枯燥的文字说明,笔者更喜欢用图和讲故事的方式来表达对于TCP/IP的理解。
三次握手:
- 金:“喂,老特,你听得到吗?”
- 特:“小金子,我听得到你呀,你听得到我吗?”
- 金: “我能听到你说话,周末我们去新加坡溜达溜达,度个蜜月吧”
两次握手:
- 金:“喂,老特,你听得到吗?”
- 特:“小金子,我听得到呀”
- 金:“老特,喂喂,你听得到吗?”
- 特:“靠,小金子,我听得到呀!!!!”
- 金:“你能不能听到我讲话啊!!喂!”
四次握手:
- 金:“喂,老特,你听得到吗?”
- 特:“小金子,我听得到呀,你听得到我吗?”
- 特:“小金子,我能听到你,你能听到我吗?”
- 金:“老特,你老糊涂了吧,……不想说话了”
三次握手图解
四次挥手图解 注:图片来源于网络面试时可能会问到:
- Q:三次握手的目的是什么?
- W: 通过三次与目标设备的通信来确定数据包发送成功。以浏览器和服务器的通信来打比方:
浏览器:你好服务器,我是 浏览器A。服务器:你好 浏览器A,我是 服务器B。浏览器:服务器B 你好。复制代码
- Q: 为什么要进行四次挥手?
- W: 当数据包发送完毕需要断开连接的时候,就需要TCP的四次挥手来保证链接的合理断开:
主动结束方:你好,我的数据发送完毕了,我要进入准备断开的状态了。(此时它虽然不再发送数据了,但是可以接受数据)另一方:我知道了,我还没有发送完毕的,你等着吧。另一方:我也发送完毕了,可以断开链接了。(此时它也进入准备断开的状态)主动结束方:好的,那断开吧。复制代码
- Q: TCP为什么建立链接是三次,关闭链接是四次呢?
1.服务端的listen状态下的socket当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送2.关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了3.你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了4.它这里的ACK报文和FIN报文多数情况下都是分开发送的复制代码