IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> ZYNQ -Lwip和TCP/IP简介 -> 正文阅读

[网络协议]ZYNQ -Lwip和TCP/IP简介

TCP/IP

TCP/IP 通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。浏览器与服务器都在使用 TCP/IP 协议, E-Mail 使用 TCP/IP 协议,电子邮件也通过 TCP/IP 协议来发送和接收邮件。因特网地址是 TCP/IP 协议。因特网地址比如 “42.120.45.233” 就是一个 TCP/IP 协议。

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

在这里插入图片描述
在 TCP/IP 内部包含一系列用于处理数据通信的协议:

  • TCP (传输控制协议) - 应用程序之间通信
  • UDP (用户数据报协议) - 应用程序之间的简单通信
  • IP (网际协议) - 计算机之间的通信
  • ICMP (因特网消息控制协议) - 针对错误和状态
  • DHCP (动态主机配置协议) - 针对动态寻址

TCP 使用固定的连接

TCP 用于应用程序之间的通信。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方"握手"之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。

IP

IP 是无连接的,IP 用于计算机之间的通信。IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP 负责将每个包路由至它的目的地。
IP 路由器:当一个 IP 包从一台计算机被发送,它会到达一个 IP 路由器。IP 路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。
TCP/IP :TCP/IP 意味着 TCP 和 IP 在一起协同工作。TCP 负责应用软件(比如您的浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。IP 负责将包发送至接受者。

IP地址

每个计算机必须有一个 IP 地址才能够连入因特网。每个 IP 包必须有一个地址才能够发送到另一台计算机。IP 地址包含 4 组数字:TCP/IP 使用 4 组数字来为计算机编址。每个计算机必须有一个唯一的 4 组数字的地址。每组数字必须在 0 到 255 之间,并由点号隔开,比如:192.168.1.60。32 比特 = 4 字节TCP/IP 使用 32 个比特来编址。一个计算机字节是 8 比特。所以 TCP/IP 使用了 4 个字节。一个计算机字节可以包含 256 个不同的值,现在,应该知道了为什么 TCP/IP 地址是介于 0 到 255 之间的 4 组数字。
IP V6:IPv6 是 “Internet Protocol Version 6” 的缩写,也被称作下一代互联网协议,它是由 IETF 小组(Internet 工程任务组Internet Engineering Task Force)设计的用来替代现行的 IPv4(现行的)协议的一种新的 IP 协议。Internet 的主机都有一个唯一的 IP 地址,IP 地址用一个 32 位二进制的数表示一个主机号码,但 32 位地址资源有限,已经不能满足用户的需求了,因此 Internet 研究组织发布新的主机标识方法,即 IPv6。

LWIP简介

LWIP 是瑞典计算机科学院(SICS)的 Adam Dunkels 等开发的一个小型开源的 TCP/IP 协议栈,是 TCP/IP的一种实现方式。 LWIP 是轻量级 IP 协议,有无操作系统的支持都可以运行。 LWIP 实现的重点是在保持TCP 协议主要功能的基础上减少对 RAM 的占用,它只需十几 KB 的 RAM 和 40K 左右的 ROM 就可以运行 , 这 使 LWIP 协 议 栈 适 合 在 低 端 的 嵌 入 式 系 统 中 使 用 。
LWIP 的主要特性如下:

  • IGMP 协议,用于网络组管理,可以实现多播数据的接收
  • Internet 协议( IP), 包括 IPv4 和 IPv6,支持 IP 分片与重装, 包括通过多个网络接口的数据包转发
  • 用于网络维护和调试的 Internet 控制消息协议( ICMP)
  • 用户数据报协议( UDP)
  • 传输控制协议( TCP)拥塞控制,往返时间( RTT)估计,快速恢复和重传
  • DNS,域名解析
  • SNMP,简单网络管理协议
  • 动态主机配置协议( DHCP)
  • 以太网地址解析协议( ARP)
  • AUTOIP, IP 地址自动配置
  • PPP,点对点协议,支持 PPPoE

编程接口方式

lwip(xilinx中的lib)提供二种用户编程接口方式: raw API 和 socket API。
Raw API:(低层次的、基于“核”和“回调”的RAW API) 是为高性能和低内存开销而定制的。 这种类型的 API 把网络协议栈和应用程序放在一个进程里,连接网络协议和应用程序的纽带是回调函数, 回调函数实际上是一个普通的 C 函数。为了接收数据,应用程序会首先向协议栈注册一个回调函数,当关联的连接有一个信息到达时,该回调函数就被协议栈调用。这种实现方式即有优点也有缺点。优点是数据的接收和发送不会导致进程的切换,提供了最好的性能,执行速度快,而且消耗的内存资源少;缺点是应用程序无法进行连续运算,因为网络协议的处理和运算是在同一进程中完成的,二者无法并行发生。 Raw API 是资源较少的嵌入式系统的首选方法,也是在没有操作系统的情况下运行 lwIP 时唯一可用的 API。
Socket API:(高层次的、基于“顺序”的API:socket API) 提供了一个基于 open-read-write-close 模块的 BSD socket-style 接口, 需要操作系统。 此接口在性能和内存要求方面不如 Raw API 高效, 不适用于小型嵌入式系统,但移植性更好。

TCP和UDP

lwIP支持的传输层协议包括:

  • UDP:一种没有可靠性机制的无连接socket协议。
  • TCP:一种面向连接的“流”协议。

设计程序前,我们首先要选择使用UDP还是TCP。

**UDP:**优点是开销更少,设计者自己选择消息大小;缺点是没有提供安全的通信路径,该协议不能通知用户对方是否收到了消息。

**TCP:**优点是提供了一个安全的通信路径,当对方成功收到消息时用户会收到通知;缺点是开销更大,还会自动选择消息大小。
选定协议后,设计者要决定应用程序如何通过网络传递数据:

UDP:确保传递的数据块不会小于网络所允许的最大数据包,比如在标准以太网中,使用udp_send一次发送1472个字节,以最大化一个包中数据字节和报头字节的比,同时最小化网络中包间的间隔。

**TCP:**虽然TCP可以将多个tcp_write调用的数据合并到一个包中,但由于这个包被分割到多个pbuf中,可能会降低性能。由于TCP需要将数据包存储起来重新传输,直到远程主机发出应答信号,所以在tcp_write/tcp_output返回后花费几秒的时间。如果要发送小块数据,应该关掉nagle算法,让堆栈立即发送数据,而不是等待更多数据形成更大的数据包后才发送数据。应该避免发送小块数据,总是等待应答会降低性能。

TCP编程

LWIP配置步骤

使用lwIP的程序,无论TCP还是UDP,在进入while(1)循环前,都会有这样一个配置流程:

  • 设置开发板MAC地址
  • 开启中断系统
  • 设置本地IP地址
  • 初始化lwIP
  • 添加网络接口
  • 设置默认网络接口
  • 启动网络
  • 初始化TCP或UDP连接(自定义函数)

TCP编程

RAW API函数一览表

请添加图片描述

初始化

在使用任何TCP函数前,必须先调用**lwip_init()函数。此后必须每隔TCP_TMR_INTERVAL(通常取250ms)调用一次tcp_tmr()函数。某些版本的lwIP只需要将sys_check_timeouts()**函数添加到主循环中,它会处理栈中所有协议的定时器。Xilinx中还是需要通过配置处理器的定时器来调用tcp_tmr()。

TCP连接步骤

一个TCP连接由一个协议控制块(Protocol Control Block,PCB)做标识。有两种建立连接的方法。

被动连接(监听)方法,相当于作为服务端(server):

  1. 调用pcb_new创建一个pcb。
  2. (可选)调用tcp_arg将应用程序中特定的值于PCB关联在一起。
  3. 调用tcp_bind函数指定本地IP地址和端口。
  4. 调用tcp_listen或tcp_listen_with_backlog,这些函数将释放作为参数的PCB,并返回一个更小的监听PCB,如“tcp_new = tcp_listen(tpcb);”。
  5. 调用tcp_accept指定新连接到来时要调用的函数。

主动连接方法,相当于作为客户端(client):

  1. 调用pcb_new创建一个pcb。
  2. (可选)调用tcp_arg将应用程序中特定的值于PCB关联在一起。
  3. (可选)调用tcp_bind函数指定本地IP地址和端口
  4. 调用tcp_connect函数。

发送TCP数据

在TCP连接上发送数据的步骤如下:

  1. 调用tcp_sent()函数设置回调函数;
  2. 调用tcp_sendbuf()函数查找可以发送的最大数据量;
  3. 调用tcp_write()函数把数据排队;
  4. 调用tcp_output()函数强制发送数据。

接收TCP数据

TCP数据接收是基于回调的,当新数据到达时,将调用应用程序指定的回调函数。TCP协议设定了一个窗口(window),该窗口告诉发送主机它可以在连接上发送多少数据。所有连接的窗口大小都是lwipopts.h中设置的TCP_WND值。当应用程序处理了传入的数据后,必须调用tcp_recved()函数,以指示TCP可以增加接收窗口。

lwIP 会话建立顺序图

由于 raw TCP 实现主要通过回调执行, 因此其操作往往与各个消息的接收和处理密切相关。因此,熟
悉底层 TCP 协议是有帮助的。 对于没有 lwIP 使用经验的人来说,有时并不清楚什么时候需要调用什么。下表显示了远程客户端和本地 lwIP tcp 服务器之间交互的顺序图。

请添加图片描述
请添加图片描述
请添加图片描述
tcp_write()只对TCP数据进行排队,以便稍后传输,它实际上并没有开始传输。但是如果是在接收回调中使用tcp_write(),如上表中的示例,则不需要调用tcp_output()来传输要发送的数据。如果在接收回调中使用了tcp_output,它不会执行任何操作。

当接收回调函数返回时,lwIP栈会自动启动数据的发送,远程客户端的前一个数据包的应答将于第一个传出的数据段相结合。如果在其它地方调用tcp_write,则可能需要调用tcp_output来启动数据传输。

下面再给出一个lwIP作为客户端连接远程服务器的序列图:

请添加图片描述
请添加图片描述
上表中在连接建立前便建立了接收和发送的回调函数,该操作也可以在连接建立后进行。如果连接失败,客户端可以通过tcp_err()设置的回调函数得到失败的通知。

references

  1. 正点原子嵌入式开发教程
  2. 学会Zynq(11)RAW API的TCP和UDP编程
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 10:11:58  更:2021-08-06 10:12:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 13:15:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计