• TCP/IP 传输原理


    TCP传输原理简单说明
    TCP传输需要经过3次握手4次挥手。
     
     
    三次握手
      当客户端向服务端进行连接时,会发送一个SYN报文,请求服务端监听端口,服务端确认请求后,会向客户端发送ACK确认,客户端收到ACK确认请求时也会向服务端发送ACK确认并开启链接通道,服务端收到ACK确认报文后开启链接通道,完成三次握手。
      
    四次挥手
      客户端结束服务端连接时会向服务端发送FIN报文请求关闭,服务端收到报文后发送ACK确认关闭,并向客户端也发送FIN报文,客户端收到报文向服务端发送ACK确认后完成四次挥手。
     
    注:因为TCP是全双功所以,传,送,两端都需要关闭
     
     
    客户端的状态可以用如下的流程来表示:
    CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
     
    服务器的状态可以用如下的流程来表示:
    CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
     
    LISTEN->SYN_SENT    对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
    
    SYN_SENT->SYN      收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED
    
    SYN_SENT->CLOSED    在发送超时的情况下,会返回到CLOSED状态。
    
    SYN_收到->LISTEN     如果收到RST包,会返回到LISTEN状态。
    
    SYN_收到->FIN_WAIT_1  这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。
    参数说明

    CLOSED: 这个没什么好说的了,表示初始状态。
     
    LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
     
    SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
     
    SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
     
    ESTABLISHED:这个容易理解了,表示连接已经建立了。
    
    FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
    FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
    TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
    CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
    CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
    LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
     
     
     
     
     
     
  • 相关阅读:
    ubuntu20.04安装教程TLS,ubuntu安装教程20.04
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu20.04图文安装教程
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu安装教程20.04
    ubuntu19.10安装搜狗输入法,ubuntu19.10安装中文输入法
    ubuntu20.04安装搜狗输入法,ubunru安装搜狗输入法中文输入法拼音
    前端实现实时通讯
    移动端1px边框的实现
    利用js自动触发一个a标签的下载事件
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/8337558.html
Copyright © 2020-2023  润新知