网上已经有很多解释了,就不瞎说了,Mark一些链接作为自己的学习笔记吧。
学习参考链接1
学习参考链接2
学习参考链接3
学习参考链接4
为什么要3次握手
防止已过期的连接请求报文突然又传送到服务器,因而产生错误。
Client发生一个请求连接报文可能因为网络延迟等原因,没有送达到server中。但是当这个client的请求报文送达到server时,如果没有三次握手的话,server就会直接发数据可client,这样会导致server资源的浪费。
这个问题的本质是, 信道不可靠。
信道不可靠,但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足”在不可靠信道上可靠地传输信息”这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。
为什么要4次挥手?
确保数据能够完成传输。
关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。