美文网首页
Tcp三次握手和四次挥手。

Tcp三次握手和四次挥手。

作者: 森林中大鸟 | 来源:发表于2020-05-18 21:33 被阅读0次

    Tcp连接创建时需要三次握手,断开连接时,需要四次挥手。

    参考原文:
    https://blog.csdn.net/qzcsu/article/details/72861891
    https://blog.csdn.net/qq_38950316/article/details/81087809

    疑问

    先关读,再关写 什么意思?

    基础知识

    序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

    确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

    确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

    同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

    终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

    PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号

    三次握手

    第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

    原因:三次握手之后,服务器与客户端才能确保对方的发送与接受能力均正常。
    PS:服务器收到客户端第一次握手信息后,能确保客户端发送能力正常;客户端接收到服务器端的二次握手信息后,能确保服务器端的接受,发送能力都正常;第三次握手,服务器端能确保,客户端接受能力正常。三次后,双方互相确认接受,发送能力正常。

    假设两次挥手创建链接
    场景1:如果客户端发送第一次握手的报文被网络阻塞,在服务器接收到后已经超时,服务器端仍响应并创建连接,客户端则认为已经超时不会使用该链接,且可能会再次请求创建连接,导致资源浪费。
    场景2:如果客户端发送第一次握手报文被服务器端正常接收,服务端进行第二次握手并创建连接,此时如果客户端未及时收到第二次握手的信息,认为连接创建失败,再次发起连接,导致资源浪费。

    四次挥手

    中断连接端可以是Client端,也可以是Server端。

    (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段1)。
    (2)服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段2)。和SYN一样,一个FIN将占用一个序号。
    (3)服务器关闭客户端的连接,发送一个FIN给客户端(报文段3)。
    (4)客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段4)。

    原因:关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

    为什么客户端最后还要等待2MSL?

    MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

    第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

    第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

    如果已经建立了连接,但是客户端突然出现故障了怎么办?

    TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

    相关文章

      网友评论

          本文标题:Tcp三次握手和四次挥手。

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