美文网首页
TCP/UDP相关

TCP/UDP相关

作者: CodeYang | 来源:发表于2021-09-11 11:22 被阅读0次

    TCP(传输控制协议)

    传输控制协议[TCP,Transmission Control Protocol]
    是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    三次握手

    “三次握手” 的目的是 “为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

    三次握手的目的

    “已失效的连接请求报文段” 的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”

    1. 客户端发送一包连接请求数据(SYN包),能否与你建立连接
    2. 如果对端同意建立连接,回复一包(SYN+ACK包)
    3. 客户端收到之后,回复一包ACK包,连接建立
    三次握手

    为什么不是两次握手(如果客户端收到 SYN+ACK包就建立连接)?

    为了防止因为已失效的请求报文,突然又传到服务器引起错误。
    三次握手,如果服务端收不到最后的ACK包,就不会建立连接。
    三次握手本质就是把为例解决网络信道不可靠的问题。

    两次握手造成状态不一致

    四次挥手

    1. 客户端主动发起连接关闭请求,它向服务器发送一包FIN包,表示要关闭连接,自己进入终止等待1状态。
    2. 服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态。(服务端此时还可以发送未发送的数据,客户端还可以接收数据)
    3. 待服务端发送数据之后,发送一包FIN包,进入最后确认状态。
    4. 客户端收到之后回复 ACK 包,进入超时等待状态,经过超时时间后关闭连接。而服务端收到ACK包之后,立即关闭连接。
    四次挥手

    为什么客户端需要等待超时时间?

    这是为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK包后就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态。
    如果客户端发送最后一包ACK包之后,等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间。

    这个机制跟三次握手一样,也是为了保证在不可靠的网络链路中进行可靠的连接断开。

    相关文章

      网友评论

          本文标题:TCP/UDP相关

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