首页 > 其他分享 >TCP握手与重发机制

TCP握手与重发机制

时间:2024-03-01 13:11:07浏览次数:23  
标签:请求 握手 TCP 重发 序号 服务器 连接 客户端

TCP通信时序

 

TCP三次握手

1. 客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的段1。

客户端发出段1,SYN位表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,也可以发现
丢包的情况,另外,规定SYN位和FIN位也要占一个序号,这次虽然没发数据,但是由于发了SYN位,因此下次再发送应该用序号1001。mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链
路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。

2. 服务器端回应客户端,是三次握手中的第2个报文段,同时带ACK标志和SYN标志。它表示对刚才客户端SYN的回应;同时又发送SYN给客户端,询问客户端是否准备好进行数据通讯。

服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端的连接请求,同时也
给客户端发出一个连接请求,同时声明最大尺寸为1024。

3.客户必须再次回应服务器端一个ACK报文,这是报文段3。

客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。在这个过程中,客户端和服务器分别给对方发了连接请求,也应答了对方的连接请求,其中服务器的请求和应答在一个段中发出,
因此一共有三个段用于建立连接,称为“三方握手(three-way-handshake)”。在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值、最大段尺寸等。

数据传输

  1. 客户端发出段4,包含从序号1001开始的20个字节数据。

  2. 服务器发出段5,确认序号为1021,对序号为1001-1020的数据表示确认收到,同时请求发送序号1021开始的数据,服务器在应答的同时也向客户端发送从序号8001开始的10个字节数据,这称为piggyback。

  3. 客户端发出段6,对服务器发来的序号为8001-8010的数据表示确认收到,请求发送序号8011开始的数据。

  4. 在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中,发出数据包给对方之后,只有收到对方应答的ACK段才知道该数据包
    确实发到了对方,可以从发送缓冲区中释放掉了,如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后TCP协议自动将发送缓冲区中的数据包重发。

    TCP 四次挥手

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有
    数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
    1. 客户端发出段7,FIN位表示关闭连接的请求。

    2. 服务器发出段8,应答客户端的关闭连接请求。

    3. 服务器发出段9,其中也包含FIN位,向客户端发送关闭连接请求。

    4. 客户端发出段10,应答服务器的关闭连接请求。

建立连接的过程是三方握手,而关闭连接通常需要4个段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送数据给服务
器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。

  

标签:请求,握手,TCP,重发,序号,服务器,连接,客户端
From: https://www.cnblogs.com/dxqNet/p/18046752

相关文章

  • Qt QModbus相关类实现ModbusTcpServer总结
    在疫情环境下催生出了很多的无人或者减少人员接触的项目,比如无人智慧餐厅项目中的无人送餐项目,主要是由送餐小车和一个中控屏和部分协助发餐的设备组成,由于餐厅一般的范围不会很大,考虑到Wi-Fi通信可能比较麻烦,我们前期组网协议使用的是zigbee,这样的话小车可以无网络运行且待......
  • 2024-02-29-Linux高级网络编程(4-TCP编程)
    4.TCP编程4.1TCP介绍面向连接的流式协议;可靠、出错重传、且每收到一个数据都要给出相应的确认通信之前需要建立链接服务器被动链接,客户端是主动链接TCP编程流程服务器:1.创建套接字socket()2.将套接字与服务器网络信息结构体绑定bind()3.将套接字设置为监听状......
  • LWIP RAW接口TCP与UDP部分函数解析
    RAWTCP接口tcp_input()函数voidtcp_input(structpbuf*p,structnetif*inp) --->staticerr_ttcp_process(structtcp_pcb*pcb) --->staticvoidtcp_receive(structtcp_pcb*pcb) --->>TCP_EVENT_RECV(pcb,recv_data,ERR_OK,err);//调用用户注册......
  • P10160 [DTCPC 2024] Ultra 题解
    【题目描述】给你一个\(01\)序列,你可以进行如下操作若干次(或零次):将序列中形如\(101\cdots01\)的一个子串(即\(1(01)^k\),\(k\ge1\))替换成等长的\(010\cdots10\)(即\(0(10)^k\))。你要操作使得\(1\)的个数尽可能少,输出最少的\(1\)的个数。【思路】一开始看到这道题......
  • ModbusTCP从站建立
    背景根据网络安全策略要求,无法程序作为主站进行PLC的读取解决方案:PLC作为主站,程序作为从站进行被动的数据火获取,后续根据数据变化值进行建立解决方案使用NModbus4组件构建从站在同个程序中开启不同的端口区分不同的PLC信号写入从站开启监听代码IPEndPointiPEn......
  • http、tcp/ip
    报文格式地图——重庆网管博客(023wg.com)一、软件开发架构1、B/S:browser浏览器 --------〉server2、C/S:client客户端 --------〉server二、OSI七层协议1、OSI的七层协议物理层(PhysicalLayer):物理层负责传输比特流(0和1)的物理介质,例如电缆、光纤和无线电频......
  • 监控TCP11种状态集命令、脚本(centos7)
    监控TCP11种状态集命令、脚本(centos7)先决条件:用户有足够的权限来执行netstat​命令。不是root用户可能需要在命令前加上sudo​。安装了netstat​。命令合集,脚本:#!/bin/bash#清除旧的输出clear#显示所有TCP连接的状态echo"所有TCP连接状态:"net......
  • 监控TCP11种状态集命令、脚本(centos7)
    监控TCP11种状态集命令、脚本(centos7)先决条件:用户有足够的权限来执行netstat​命令。不是root用户可能需要在命令前加上sudo​。安装了netstat​。命令合集,脚本:#!/bin/bash#清除旧的输出clear#显示所有TCP连接的状态echo"所有TCP连接状态:"net......
  • PC上位机通过TCP传输视频至FPGA小结
    笔记:TCP/IPLWIPFPGA笔记-CSDN博客上位机建立TCP/IP连接:Matlab实现-CSDN博客小结:1.通过Matlab建立的上位机非常稳定,可以轻松实现图片的发送;clc;clearall;closeall;warningoff;%ConfigPacketFramePacketConfigPacket_Length=14;%配置包单帧长ConfigPack......
  • qtcpsocket连接状态
      QTcpSocketsocket;//连接到远程主机socket.connectToHost("remoteHost",1234);//获取连接状态QAbstractSocket::SocketStatesocketState=socket.state();//根据连接状态进行相应处理if(socketState==QAbstractSocket::UnconnectedState){//未连......