socket 编程接口 对某种操作系统数据结构的抽象 (网络通信,发送信道 接收信道) 使用哪些系统调用接口来向这2个信道进行数据的 发送 接收

C/S模式 client(多 从) Server(单 主) 从设备 主动 向 主设备进行请求, 主设备接收到这个请求后,进行解析并响应

服务器先执行,在服务器机器上等待客户端的请求

一、UDP服务器编程模型 1. socket() 获取 操作系统抽象数据结构的对象 2. 主动的先执行,等待客户端的请求,客户端的请求包到达服务器,如何这个数据包正确的找到服务器的进程 pid 进程号 —- 端口号 就是在服务器上,开后门 bind() 系统调用 把端口开放 3. 等待新的客户端发来请求 recvfrom

二、UDP客户端编程模型 1. socket() 获取 操作系统抽象数据结构的对象 2. bind() 不建议做 但是该填写自己的端口,发送UDP数据包,src ip:port dest ip:port bind(88991) 客户端代码会在不同的机器上运行,无法保证每个客户端都没有使用88991端口号 不调用bind,src ip:port 没有信息 为了能够将这个数据发送到网卡上,内核就会自动的选择一个当前系统没有被使用的端口号作为src 3. sendto() 向某一个IP和port上发送数据包

三、UDP协议抓包分析 UDP 从协议角度上, 只有目的端口、源端口的数据,不提供任何跟有序 无丢失的 传输提供帮助 UDP 面向数据报协议 TCP 面向连接的协议

UDP丢包 
        1.服务器根本就不存在(对应的端口号没有),UDP包到了网络层,网络传送给传输层,传输层没有缓存区来存这个数据,自然这个数据就丢失了
        2.UDP的数据包在网络传输中,信号衰减没了
假丢包  服务器存在,端口号也正常的,但是由于服务器的执行太慢了,迟迟不能执行到recvfrom的接口处,
        此时数据包到达该机器后,分配给UDP层,UDP层发现数据包的目的端口和我的一样,把这个数据包暂时存放在缓存区里
        缓存区里是接收数据包(只要是端口号是这个服务器的,就接收,仓库里按照数据包进行管理的)[TCP缓存区只能存放一个源地址的信息]

UDP 有缓存区,只是这个缓存区里的数据,传输层确认这个数据是否有序,是否丢失,不确定
丢包:链路和路由选择时,会引起丢失