最近开始复习了,以前学过的网络知识有点遗忘,所以做一点总结,让自己回忆起来。
为什么要三次握手
为什么TCP连接采用三次握手而不是两次,四次?
TCP的核心思想是,既要保证数据可靠传输,又要保证传输的效率。而三次恰好可以满足这两方面的需求。三次握手目的在于同步连接双方的序列号和确认号并交换 TCP窗口大小信息,让双方都确认自己发送的信息对方能够收到。这样三次就足够了,四次效率低且浪费资源。如果采用两次握手,并不能保证数据的可靠传输。举例如下:
client认为发送的第一个SYN请求报文段丢失,然后发起第二个SYN,如果是两次握手,server端回应后连接就建立了。然而client发出的第一个SYN请求报文段并没有丢失,而是在某个网络节点长时间滞留了,以致延误到client-server连接释放以后它才到达了server。本来这是一个早已失效的报文段,但server收到此失效的连接请求报文段后,就误认为client再次发出一个新连接请求。于是就向client发出确认报文段,同意建立连接。在两次握手的情况向,这时新的连接就建立了。但是client实际上并没有发出建立连接的请求,因此并不会理睬server的确认,也不会像server发送数据。但server却单方面认为连接已经建立,就开始一直等待client发送数据。这样,server的资源就白白浪费掉了。采用”三次握手”的办法可以防止上述现象发生。
实际上,三次握手可理解为两次握手(两次SYN)和两次确认(两次ACK),只不过中间的握手和确认合并为1次,这也是传输效率的一个体现。并且最后一次确认某些情况下可能会和数据一块发送,这和经受时延的ACK有关。
下面是TCP三次握手和四次挥手的图,来自于酷壳网。
为什么要四次挥手?
TCP连接是一种面向连接的、可靠地、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机A发送FIN报文段时,只是表示主机A没有数据要发送了。但是,这个时候主机A还是可以接受来自主机B的数据,处于半关闭状态;当主机B返回ACK报文段时,表示主机B已经知道主机A没有数据要发送了,但是主机B此时还是可以发送数据到主机A的;只有当主机B也发送FIN报文段时,表示主机B也没有数据要发送了。此时双方都关闭了连接,全双工TCP连接就真正断开了。
实际上,有可能是三次挥手。被动关闭的一端由于不需要再发送数据了。因此ACK和FIN可能会一起发送。