• lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议


    目录

    1 TCP管理

    1.1 三次握手

    1.2 四次挥手

    1.3 保活计时器

    2 wireshark安装及实验

    3.1 icmp协议抓包演示

    3.2 tcp协议抓包演示

    3 UDP协议

    3.1 UDP 的主要特点:

    4 练习


    1 TCP管理

    1.1 三次握手

    TCP 建立连接的过程叫做握手。

    采用三报文握手:在客户和服务器之间交换三个 TCP 报文段,以防止已失效的连接请求报文段突然又传送到了,因而产生 TCP 连接建立错误

    1. B 的 TCP 服务器进程先创建传输控制块 TCB,准备接受客户进程的连接请求。
    2. A 的 TCP 向 B 主动发出连接请求报文段,其包头中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。注意:TCP规定,SYN 报文段(即SYN = 1的报文段)不能携带数据,但要消耗掉一个序号。
    3. B 的 TCP 收到连接请求报文段后,如同意,则发回确认。 B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号 ack = x + 1自己选择的序号 seq = y。注意:这个报文段也不能携带数据,但同样要消耗掉一个序号。
    4. A 收到此报文段后向 B 给出确认,其 ACK = 1确认号 ack = y + 1。 A 的 TCP 通知上层应用进程,连接已经建立。注意:TCP 标准规定:ACK 报文段可以携带数据。 但如果不携带数据,则不消耗序号。下一个数据报文段的序号仍是 seq = x + 1
    5. B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。双方可以开始数据传送。

    1.2 四次挥手

    TCP 连接释放过程比较复杂。

    数据传输结束后,通信的双方都可释放连接

    TCP 连接释放过程是四报文握手。

    1. A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。 TCP规定:FIN 报文段即使不携带数据,也消耗掉一个序号。
    2. B 发出确认,ACK=1,确认号 ack = u+1,这个报文段的序号 seq = v。 TCP 服务器进程通知高层应用进程。 从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭 (half-close) 状态。B 若发送数据,A 仍要接收。
    3. 若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。 FIN=1,ACK=1,确认号 ack = u+1,这个报文段的序号 seq = w
    4. A 收到连接释放报文段后,必须发出确认。  ACK=1,确认号 ack=w+1,自己的序号 seq = u + 1
    5. 请注意:此时 TCP 连接还没有释放掉。必须经过时间等待计时器 (TIME-WAIT timer) 设置的时间 2MSL 后,A 才释放 TCP 连接。

    1.3 保活计时器

    用来防止在 TCP 连接出现长时期空闲。

    通常设置为 2 小时 。

    若服务器过了 2 小时还没有收到客户的信息,它就发送探测报文段。

    若发送了 10 个探测报文段(每一个相隔 75 秒)还没有响应,就假定客户出了故障,因而就终止该连接。

    2 wireshark安装及实验

    windows下载:Wireshark · Download

    linux下载:

    1. sudo apt-get install wireshark
    2. //添加权限
    3. sudo chmod 777 /usr/bin/dumpcap

    3.1 icmp协议抓包演示

    每ping一下,发送、应答 

    3.2 tcp协议抓包演示

    http协议的端口是443

    3 UDP协议

    UDP 只在 IP 的数据报服务之上增加了一些功能:

    • 复用和分用
    • 差错检测

    3.1 UDP 的主要特点:

    • 无连接。发送数据之前不需要建立连接。
    • 使用尽最大努力交付。即不保证可靠交付。
    • 面向报文。UDP 一次传送和交付一个完整的报文。
    • 没有拥塞控制。网络出现的拥塞不会使源主机的发送速率降低。很适合多媒体通信的要求。
    • 支持一对一、一对多、多对一、多对多等交互通信。 首部开销小,只有 8 个字节。
    • UDP 通信的特点:简单方便,但不可靠。

    UDP 是面向报文的

    发送方 UDP 对应用层交下来的报文,既不合并,也不拆分,按照原样发送

    接收方 UDP 对 IP 层交上来的 UDP 用户数据报,去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。 

    UDP在计算校验和时,需要使用一个伪首部(Pseudo Header)来增强校验的准确性。伪首部通常在计算校验和时与UDP数据包头部一起进行处理,以确保校验和的准确性。伪首部的组成如下:

    1. 源IP地址:4个字节,表示发送方的IP地址。

    2. 目标IP地址:4个字节,表示接收方的IP地址。

    3. 保留字段:1个字节,全为0。

    4. 协议字段:1个字节,表示上层协议的类型,对于UDP来说,该字段的值为17。

    5. UDP数据包长度:2个字节,表示整个UDP数据包的长度。

    伪首部的组成不包含在UDP数据包的实际字节中,而是在计算校验和时与UDP数据包头部一同处理。伪首部的目的是增加校验和的准确性,确保校验和的计算正确,并有效地检测数据在传输过程中的任何变化。

    需要注意的是,伪首部只用于计算校验和,而不是作为实际的数据传输

    UDP数据包的具体字节组成如下:

    1. 源端口和目标端口:每个端口号占用2个字节,共4个字节。源端⼝号。在需要对⽅回信时选⽤。不需要时可⽤全 0。⽬的端⼝号。终点交付报⽂时必须使⽤

    2. 长度字段:2个字节,表示整个UDP数据包的长度。其最⼩值是 8(仅有⾸部)

    3. 校验和字段:2个字节,用于校验数据包的完整性。检测 UDP ⽤户数据报在传输中是否有错。有错就丢弃  

    4. 数据部分:根据应用程序发送的实际数据而定,可以是任意长度。

    下面是一个简单的UDP数据包的例子(以16进制表示):

    源端口号: 0xABCD (2个字节) 目标端口号: 0x1234 (2个字节) 长度字段: 0x0012 (2个字节) 校验和字段: 0x5678 (2个字节) 数据部分: 0x48656C6C6F20576F726C64 (11个字节,对应ASCII编码的"Hello World")

    4 练习

    • 1.画出三次握手的过程
    • 2.画出四次握手的过程
    • 3.实现TCP通信,并使用wireshark抓包,提交wireshark抓包截图,截图内容包含三次握手过程和四次握手过程

  • 相关阅读:
    131-Vue中ref与$refs的使用方法
    中青看点阅读新闻
    深入理解Java虚拟机-垃圾收集器与内存分配策略
    基于混合策略改进的鲸鱼优化算法
    在华为和比亚迪干了5年测试,月薪25K,熬夜总结出来的划水经验.....
    Linux笔记
    2023年【危险化学品经营单位安全管理人员】考试题及危险化学品经营单位安全管理人员模拟试题
    4种经典的限流算法与集群限流
    SynchroTrap:基于相似度的异常检测算法
    第十二章 Spring Cloud Config 统一配置中心详解-客户端动态刷新
  • 原文地址:https://blog.csdn.net/m0_60718520/article/details/133582532