tcp 三次握手建立连接难点总结

时间:2023-03-08 22:21:51
tcp 三次握手建立连接难点总结

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

要了解tcp包的头部信息

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。包首部就像协议的脸。

下面是tcp包头的信息

tcp 三次握手建立连接难点总结

这里要区分32位确认序号ack 和标志位的ACK,标志位的ACK一般为空或者置为1,但是确认序号ack一般是和序号seq这一串数字+1。

    • TCP端口号
      TCP的连接是需要四个要素确定唯一一个连接:
      (源IP,源端口号)+ (目地IP,目的端口号)
      所以TCP首部预留了两个16位作为端口号的存储,而IP地址由上一层IP协议负责传递
      源端口号和目地端口各占16位两个字节,也就是端口的范围是2^16=65535
      另外1024以下是系统保留的,从1024-65535是用户使用的端口范围

    • TCP的序号和确认号
      32位序号 seq:Sequence number 缩写seq ,TCP通信过程中某一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。
      32位确认号 ack:Acknowledge number 缩写ack,TCP对上一次seq序号做出的确认号,用来响应TCP报文段,给收到的TCP报文段的序号seq加1。

    • TCP的标志位
      每个TCP段都有一个目的,这是借助于TCP标志位选项来确定的,允许发送方或接收方指定哪些标志应该被使用,以便段被另一端正确处理。
      用的最广泛的标志是 SYNACK 和 FIN,用于建立连接,确认成功的段传输,最后终止连接。

      1. SYN:简写为S,同步标志位,用于建立会话连接,同步序列号;
      2. ACK: 简写为.,确认标志位,对已接收的数据包进行确认;
      3. FIN: 简写为F,完成标志位,表示我已经没有数据要发送了,即将关闭连接;
      4. PSH:简写为P,推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
      5. RST:简写为R,重置标志位,用于连接复位、拒绝错误和非法的数据包;
      6. URG:简写为U,紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;

建立连接的过程

seq 和 ack 的信息就像是客户端与服务端通信的问答信息。

第一个包:客户端请求(问)

第二个包:服务端应答(答),并且也有一个请求,SYN=1,也生成一个seq(问)

第三个包:客户端回应(答),回答第二个包里的seq,返回ack=seq+1

tcp 三次握手建立连接难点总结

    • 第一次握手
      客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=J,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

    • 第二次握手
      服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=J+1,随机产生一个序号值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

    • 第三次握手
      客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

https://blog.csdn.net/a519640026/article/details/104448480