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

目录

[1 TCP管理](#1 TCP管理)

[1.1 三次握手](#1.1 三次握手)

[1.2 四次挥手](#1.2 四次挥手)

[1.3 保活计时器](#1.3 保活计时器)

[2 wireshark安装及实验](#2 wireshark安装及实验)

[3.1 icmp协议抓包演示](#3.1 icmp协议抓包演示)

[3.2 tcp协议抓包演示](#3.2 tcp协议抓包演示)

[3 UDP协议](#3 UDP协议)

[3.1 UDP 的主要特点:](#3.1 UDP 的主要特点:)

[4 练习](#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下载:

复制代码
sudo apt-get install wireshark

//添加权限
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抓包截图,截图内容包含三次握手过程和四次握手过程
相关推荐
A小辣椒15 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒19 小时前
TShark:基础知识
linux
AlfredZhao21 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
网络研究院3 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展