1、LWIP有3种编程接口:RAW(裸机跑,不带操作系统)、NETCONN和SOCKET(要带操作系统)
例程使用的是ucos小型操作系统,ucosii任务数限制了最大只能有255个任务(其中0—空闲任务和254、255—系统任务不能用),ucosiii没有限制
程序上下文的切换采用汇编来编写,一般程序的运行过程是预处理à编译à汇编à运行,如果使用汇编进行编程可提高程序的运行效率,节省C语言转换成汇编语言的步骤,直接对集成电路操作,执行效率较高,但是不易理解,适当会点对自己来说有好处
UDP--用户数据包协议,是无连接、不可靠的传输协议,OSI七层模型中的传输层协议 TCP/IP--4层
端口号:0`65535,有一些公用端口不能使用
2、OSI模型(开放系统互连参考模型)与TCP/IP模型
2.1、OSI简介:采用了分层的结构化技术,共分七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。(TCP/IP—四层结构=应用层+传输层+网络层+网络接口层)
2.2、物理层:提供为建立、维护和拆除物理链路所需要的机械的、电气的、功能的和规程的特性;有关的物理链路上传输非结构的位流以及故障检测指示。
数据链路层:在网络层实体间提供数据发送和接收的功能和过程;提供数据链路的流控。
网络层:控制分组传送系统的操作、路由选择、拥护控制、网络互连等功能,它的作用是将具体的物理传送对高层透明。
传输层:提供建立、维护和拆除传送连接的功能;选择网络层提供最合适的服务;在系 统之间提供可靠的透明的数据传送,提供端到端的错误恢复和流量控制。
会话层:提供两进程之间建立、维护和结束会话连接的功能;提供交互会话的管理功能,如三种数据流方向的控制,即一路交互、两路交替和两路同时会话模式。
表示层:代表应用进程协商数据表示;完成数据转换、格式化和文本压缩。
应用层:提供OSI用户服务,例如事务处理程序、文件传送协议和网络管理等。
OSI模型是标准的、理想的网络结构,但是不切合实际的应用,所以推出TCP/IP模型,是简化后的OSI,在实际应用中比较广泛,大多数网络协议是在该基础上演变出来的,例如:http--超文本传输协议
OSI模型的应用层 + 表示层 + 会话层 == TCP/IP的应用层
OSI模型的数据链路层 + 物理层 == TCP/IP的网络接口层
3、UDP协议简介
UDP是用于数据包协议,是OSI参考模型中的传输层协议,是一种无连接的(TCP是面向连接的)、不可靠的传输协议。UDP协议只是尽可能的将应用层的数据发送出去,不提供任何的浏览量控制、报文确认等,也就是说当报文发送以后是无法得知报文是否安全完整的到达目的主机的。(UDP只负责发送不管接收方是否接收到,无ACK应答回发)
UDP协议的优缺点:
缺点:没有确认数据包是否正确的发送到目的主机,因此UDP报文有可能丢失、出错等(可靠性低)。
优点:由于UDP协议省去了建立连接,数据确认、流量控制等一系列的过程,因此UDP的协议代码量少,处理过程简洁,实时性好!因此适合那些对轻微的数据差错不敏感的应用,如网络电话和网络视频等。
3.1、UDP报文交付
用户进程使用UDP来传送数据时,UDP协议会在数据前加上首部组成UDP报文,并交给IP协议发送,IP层将报文封装在IP数据报中并交给底层发送,在底层,IP数据报会被封装在物理数据帧。因此,一份用户数据在被发送时,经历三次封装过程。
在接收端,物理网络先接收到数据帧,然后逐层地将数据递交给上层协议,每一层都在向上层递交前去除掉一个首部。在UDP层,它将从IP层得到UDP报文,UDP协议会根据该报文首部中的目的端口字段将报文递交给用户进程,绑定到这个目的端口进程间等到报文中的数据。从两台对等的机器上看,目的主机上IP层传递给UDP层的报文等同于源主机上UDP层传递给IP层的报文,目的主机上UDP层传递给用户进程的数据正好是源主机上用户进程传递给UDP的数据。
3.2、UDP报文格式
用户数据报 = UDP首部 + UDP数据区
由4个16位字段组成,用户数据报从哪个端口来,要到哪个端口去、总长度和校验和
3.2、UDP伪首部与校验和
伪首部完全是虚拟的,并不会与用户数据报一起被发送出去,只是在校验和计算过程中被使用,UDP校验和的计算覆盖三部分:UDP伪首部、UDP首部、UDP数据区,为16位二进制反码求和。
LWIP中使用UDP控制块来描述UDP,UDP控制块是UDP协议最核心的东西,UDP控制块是一个结构体,这个结构体在udp.h中定义。
struct udp_pcb
{
IP_PCB; //宏IP_PCB中的各个字段
struct udp_pcb *next; //指向udp_pcb,用于将控制块组织成链表
u8_t flags; //控制块状态字段
u16_t local_port, remote_port; //本地端口号和目的端口号
udp_recv_fn recv; //处理数据的回调函数
void *recv_arg; //传递给回调函数的参数
};
recv字段指向的是一个函数,这个函数需要我们来编写,当内核收到报文并匹配到某个控制块以后通过函数指针recv来回调这个我们编写的处理函数,recv指向的是udp_recv_fn类型的,udp_recv_fn如下:
typedef void (*udp_recv_fn) (void *arg, struct udp_pcb *pcb, struct pbuf*p, ip_addr_t *addr, u16_t port);
arg:表示将传递给函数的用户自定数据。
pcb:指向接收到报文的UDP控制块结构。
p: 指向接收到的报文。
addr:表示发送该报文的的源主机地址。
port:表示发送该报文的源主机端口。
UDP控制块链表如下:
相关API函数
函数 | 描述 |
new_udp() | 新建一个UDP的PCB控制块。 |
udp_remove() | 将一个PCB控制块从链表中删除,并释放这个控制块的内存。 |
udp_bind() | 为UDP的PCB绑定一个本地IP地址和端口号。 |
udp_connect() | 连接到指定IP地址主机的指定端口号,其实就是设置PCB控制块的remote_ip和remote_port。 |
udp_disconnect() | 断开连接。 |
udp_send() | 通过一个PCB控制块发送数据 |
4、TCP协议介绍
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。面向连接就意味着两个TCP应用(通常是客户端和服务器)在进行网络通信之前必须先建立一个TCP连接,这点和UDP是不同的,UDP是无连接的。
在TCP连接中,仅有两方通信,广播和组播是不能用TCP协议的!!
TCP是提供传输的可靠性的,TCP协议通过以下方式提供可靠性:
1)应用数据会被分割成TCP认为最适合的发送的数据块,最大传输段MSS受MTU限制。
2)当TCP发出一个报文段后,会开启一个定时器,等待目的端确认收到这个报文。
3)当TCP收到另一端发送过来的数据以后会想对方发送一个确认。
4)采用分段传输的话到达目的主机的报文段可能顺序会乱,TCP会对这些报文段进行重新排序。
5)TCP还提供流量控制。
可靠性主要还是体现在三次握手、四次挥手的SYNC洪流攻击
TCP数据包结构如下:
4.1、TCP连接建立三次握手:
1)客户端发送SYN标志置1 的TCP报文段,并且发送自己的初始序号syn,假设为j。
2)服务器收到客户端发送的SYN,然后返回一个SYN+ACK,ACK报文包含了有效的确认段,这个值就是客户端发送的初始序号j+1。同时服务器还发送一个SYN报文,SYN表明服务器响应连接,并且在报文中包含了服务器自身的初始序号ISN,假设为k。
3)客户端收到服务器发送来的SYN报文后会再次产生一个ACK报文,在这个ACK报文中包含了对服务器发送来的SYN报文的有效确认号,该值为服务器发送的ISN加1,也就是k+1。
4.2、TCP连接断开是四次挥手:
1)首先客户端主动发起断开连接,发送FIN报文,用来关闭从客户端到服务器的数据传输,该报文的序号字段假设为X。
2)服务器接收到客户端发来的FIN字报文,返回一个ACK报文,这个ACK报文的序号字段为X+1,当客户端收到这个ACK后,那么客户端到服务器的连接就断开了。
3)服务器TCP向上层通知客户端断开操作,这样服务器会发送一个FIN报文来关闭服务器到客户端的连接。FIN报文的序号字段假设为Y。
4)客户端也会返回一个ACK报文,此ACK报文的序号字段为Y+1。这样该方向上的连接也就断开了。
http:超文本传输协议,是用于www浏览的一个协议(平时输入网址名www.xxx就用到)。http是一个客户端和服务器端请求和应答的标准(TCP),是TCP协议族中的一种。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。
http是应用层协议,TCP是传输层协议,数据包在网络传输过程中,http被封装在TCP包内
作者:广东松山电子实验室
+WeChat(linzebinwinner)