美文网首页
tcp连接的建立

tcp连接的建立

作者: 杨剑锋 | 来源:发表于2020-11-05 15:57 被阅读0次

    在《输入一个网址后》中也有提到tcp连接的建立和三次握手,这篇文章就是细讲建立环节的各种细节。
    tcp建立连接就是基于三次握手的。


    image.png

    一个个报文分别细说。
    在服务器listen的状态,客户端先发了第一个报文。


    image.png
    客户端会初始化报文,随机序列号client-syn,然后将SYN置为1,这个报文没有任何应用层数据。发出后客户端处于SYN-SEND状态。 image.png

    第二个其实是两个报文合起来发了,以提高效率。一个是SYN的报文,服务器初始化自身的序列号sever-syn,然后处于SYN-RCVD状态。一个是ACK报文,在确认应答号那里将客户端的序号client-syn加一。这个报文也不包含应用层是数据。

    image.png

    第三次这个是最后的报文,ACK置为1,应答号从server-syn +1,这个阶段就可以带应用层的数据了。发送后处于established状态,服务器收到后也进入established,正式建立连接。

    以上就是三次握手的过程,在《输入一个网址后》中也有提到,三次握手是为了互相保证双方都具有发送和接收数据的能力。
    更细点讲,有两个原因。

    1.三次握手可以阻止历史连接的初始化
    因为网络是比较复杂的,在比较拥堵的情况下,有可能先发的包,反而后到。而假设这个时候旧包到了,建立了连接,会加剧网络的拥堵问题。而两次连接是没有足够的上下文信息去确定是不是历史连接。流程如图


    image.png

    2.通过同步双方序列号的方法来维护tcp的可靠性,有序和不冗余。接收方有对方的序列号,那么就可以不重复接收相同的包,如果出现超时重传的话。有序列号,就可以保证按序接收。有序列号和ack,可以确认哪些是对方已经收到的数据。这些保证都需要三次连接来提供上下文。

    相关文章

      网友评论

          本文标题:tcp连接的建立

          本文链接:https://www.haomeiwen.com/subject/jknbvktx.html