• TCP 三次握手 与 四次握手


    TCP三次握手
    ACK 和 ack 的区别 ,ACK 是 一个确认字符;ack代表确认编号,ack值 = 上一次的seq + 1 ,作用是接受上一次远端主机传来的sep + 1 然后再传给远端主机,代表从远端主机接受的数据结尾编号,从而推算出这次接受了多少数据。

     1) 客户端 向 服务器端 发送请求建立连接的报文,这个报文头部中包含 SYN = 1, ACK = 0 ,SEQ = x 。SYN是同步序列编号,是用来 在 TCP/IP建立链接过程中所使用的信号;SEQ 代表通信的字节流,x代表本次通信字节流的起始位置;第一次握手之后,客户端进入 SYS_SEND状态
     2) 服务器在收到客户端链接请求的时候,如果同意连接,便会向客户端应答一个报文。这个报文头部中 SYN =1 ,ACK = 1, SEQ = y ,ack = x + 1; 此时 SEQ = y 代表服务器端通信字节流起点。然后服务器进入SYS-RCVD状态,等待下一次客户端发来请求
     3) 客户端在收到服务器端发来的报文的时候,会继续向服务器发送一个报文,这个报文中SYN = 1 , ACK = 1 ,SEQ = x +1 ,ack = y + 1 ,表示你发的报文我已经收到了。
    

    上述过程完事之后,客户端 和 服务器端 进入 ESTABLISHED 状态。

    为什么是 三次握手 而不是 二次握手?
    首先TCP通信过程是一个全双工通信,你既要保证你能听到对方的,还要保证对方能听到你。 如果是二次握手的话,服务器端在发送完信号之后,就进入了ESTABLISHED状态,但是这样并不能保证客户端就一定能收到服务器端此次发来的信号。如果没有收到这次发来的信号,客户端就会再次重复第一步的过程。然而这个时候服务端已经进入了ESTABLISHED状态,对应的这个线程/进程就一直堵在这里,浪费资源; 在加上第三次握手的时候,就可以避免这个状态

    TCP四次握手
    前两次作用是是客户端释放链接,后两次是服务器端释放链接
    FIN 表示 关闭连接
    1)客户端 向 服务器端 发送请求释放链接, 报文头部中ACK = 1,FIN = 1, SEQ = z , z 为 客户端向服务器端发送数据的最后一个字节序号 + 1,然后客户端进入 CLOSE_WAIT1 状态
    2)服务器端在收到客户端发送的报文之后 , 报文头部中 ACK =1 ,FIN = 1,SEQ = w , ack = z + 1 。w为服务器端向该客户端发送数据的最后一个字节序号 + 1. 客户端在收到该报文之后,进入CLOSE_WAIT2状态
    3)然后再就是服务器端向客户端发送 断开服务器端到客户端这个方向的链接。 ACK =1 ,FIN = 1, SEQ = w ,ack = z+ 1 。 然后服务器端进入了LAST-ACK这个状态
    4)客户端再收到这个报文的时候 , 就进入了TIME-WAIT状态,如果在2msl的时间内,服务器端没有重发请求的话,就会向服务器端发送一个确认应答,报文头部中ACK = 1,FIN = 1, SEQ = z + 1 , ack = w +1 。

  • 相关阅读:
    异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
    IDEA选中下一个相同内容
    IDEA Springmvc 部署本地Tomcat服务器,访问主页报404错误-问题总结
    java知识点记录
    学期总结
    今日收获
    今日收获
    今日收获
    期末总结
    每日日报
  • 原文地址:https://www.cnblogs.com/letlifestop/p/11396224.html
Copyright © 2020-2023  润新知