细说三次握手与四次挥手
seq, ack, fin
seq
: 确认序列
ack
: 确认包
fin
: 断开连接包
三次握手
客户端先发送 SYN=x 请求建立连接
服务器返回 ACK=x+1,SYN=Y
客户端再回复 ACK=Y+1 建立连接成功
为什么是三次握手?
假设 client
端向 server
端发送了一个请求报文(没有丢失的报文),但是不幸在网络节点中被滞留了,以至于延误了,直到 client
端释放了该连接之后才抵达 server
端,
如果在没有第三次握手的前提下,那么 server
端会直接建立连接成功,但是 client
端这个连接对于它来讲已经失效了,所以它不会用这个连接去跟 server
进行沟通了,也就是说它不会再发任何数据给 server
端了,那么这样导致的就是呢一次连接的浪费
如果有第三次握手呢,server
端对 client
传过来的这个报文请求会向其发送 ACK 和 SYN,等待 client
回复 ACK 确认消息,该连接才会被认为是有效的,这样一来,就不会出现浪费资源的情况。
从而证明三次握手是必要的!
第二次握手证明 client
=>server
是没问题的
第三次握手证明 server
=>client
是没问题的
TCP 是全双工通信的,由于网络通信是不可靠的,所以通过三次握手可以「最低限度」的确认全双工通信通道
四次挥手
想要断开连接的一方
向 对方
发送一个 FIN 数据包,对方收到之后回复一个 ACK ,在间隔一段时间之后,再发送 FIN, 然后 主动断开的一方
回复 对方
一个 ACK
为什么是四次挥手
原因是 TCP 支持「半关闭」连接,也就是说支持双方独立关闭通道所有说需要两个独立的关闭写通道的请求,每次关闭写通道的请求都会向对方发送一个 FIN,对方返回给一个 ACK 确认。这样,就会产生两次 FIN 和 ACK,也就是四次挥手了。
在发出 FIN 之后仅仅表示它不再往连接通道里面写数据了,但并不意味着他不能从中读数据,在接收到 FIN 数据包时,立即回复 ACK,然后将剩余数据发送给它,接着再发送 FIN 数据包,此时客户端响应 ACK,连接完全断开。如果客户端没有回复 ACK,隔一段时间之后连接也会断开,通常是 2MLS
。
半双工与全双工
由此这里介绍一下 半双工
和 全双工
的概念
半双工
允许两个设备之间双向传输,但是不能「同时」传输。
例如 A 向 B 传,那么「此时」B 便不能向 A 传。
即使 B 要传,也要等 A 传送完毕了之后才能传。
全双工
允许两个设备之间「同时」向对方传输。
例如打电话,可以一边自己说话一边听对方说话。