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 连接建立错误

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第1张图片

  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 连接释放过程是四报文握手。

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第2张图片

  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协议抓包演示

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第3张图片

每ping一下,发送、应答 

3.2 tcp协议抓包演示

http协议的端口是443

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第4张图片

3 UDP协议

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

  • 复用和分用
  • 差错检测

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第5张图片

3.1 UDP 的主要特点:

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

UDP 是面向报文的

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第6张图片

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

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

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议_第7张图片

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抓包截图,截图内容包含三次握手过程和四次握手过程

你可能感兴趣的:(嵌入式开发,网络,tcp/ip,udp,linux)