沟通的艺术
我们在与他人沟通的时候,最基础的最重要的是什么?
是好的沟通方式?是恰到好处的时机?是能够设身处地地为他人着想?
是,但不完全是,沟通的第一步当然是先要礼貌地问好啦。
等一下,我们现在在做什么,心理学知识普及?这不是我们的目的,也不是我们的强项。
我们只是想来介绍一下,网络中的计算机之间是如何礼貌问好地,TCP协议是如何建立连接的。
TCP协议三次握手
TCP协议报文详解一文中,已经详细介绍了TCP报文的内容,那么TCP协议中,主机和主机之间,是如何建立连接的?
首先,请求建立连接的主机我们叫做客户端,被连接的主机叫做服务端。
第一次握手
客户端向服务端请求建立连接的时候,会发送带有序号为j(seq=j),并且控制位为SYN=1的数据包发送给服务端,此时客户端状态为SYN_SENT。
第二次握手
服务端接受到数据包后,则会在未连接队列中为客户端的SYN包(seq=j)新增一个条目,表明已收到客户端的数据包。并且服务端会向客户端发送带有序号为k(seq=k),确认号为j+1(ack=j+1),并且控制位为SYN=1,ACK=1的数据包发送给客户端,等待客户端确认,此时服务端状态则为SYN_RECV。
第三次握手
客户端收到服务端的 SYN=1, ACK=1, ack=j+1, seq=k 的数据包后,则会响应一个ACK=1, seq=j+1, ack=k+1的数据包给服务端,表示客户端已收到服务端的数据包,并进入ESTABLISHED的状态,表示连接已建立。服务端收到ACK数据包后,则会将对应的未连接队列中对应的条目删除,并进入并进入ESTABLISHED的状态,表示连接已建立。
重试与容错
为什么TCP协议一定要进行3次握手,2次不行吗?
首先假设只进行两次握手,即服务端收到SYN数据包后马上建立连接,并开始传输数据,会有什么问题呢?
如果服务端接受到SYN数据后,立马为相应的客户端建立连接,但是,客户端如果因为某些原因(比如网络中断等),未收到客户端的ACK数据包,请求重新建立连接,并向服务端重新发送SYN数据包。此时在服务端又需要重新创建连接资源,但是旧的的连接实际是无效连接,反而浪费了系统资源。如果大量的客户端长时间超时重试,则会导致服务器的资源的严重浪费。
总结
TCP协议中,为了保证互联网中连接的可靠性,采用了3次握手的机制。为了防止因为建立连接中断时,而导致频繁建立无效连接,浪费服务器资源。服务端在第一次握手时则先维持一个未连接记录表,最后连接建立成功,再将未连接记录表中的数据删除。