UDP协议
- 前置知识
- 一、应用层的进程为什么要bind端口号
- 二、如何确定网络中的一个进程
- 三、进程 服务 协议 端口之间的关系
- 四、常见的协议对应的端口
- 五、一些命令
- 六、一个进程能不能绑定多个端口号,一个端口号能不能被多个进程绑定
- 七、对任何一个协议报文的认识
- UDP协议
- 一、UDP报文格式(结构)
- 二、报头字段的介绍
- 三、如何将UDP报文解包和分用
- 四、传输层如何将应用层数据封装成UDP报文
- 五、UDP报文的特点
- 六、如何满足全双工通信
前置知识
一、应用层的进程为什么要bind端口号
是因为当数据到达传输层需要向上交付,交付到哪个进程呢,通过端口号来查找向上交付的服务进程。
二、如何确定网络中的一个进程
通过IP+端口标识网络中唯一一个进程。网络通信时用IP地址标识一台主机,用端口号标识该主机上的服务进程。
三、进程 服务 协议 端口之间的关系
进程通过操作系统提供的端口进行网络通信提供服务。进程提供一个或多个服务,一个服务基于一个协议或多个协议实现,一个协议可能对应一个或多个端口。协议确保了数据的传输规则和格式,有效载荷在每个层添加报头进行封装,报头的结构内容就是根据协议实现。
四、常见的协议对应的端口
标识端口的类型是16位的,所以端口的大小范围0~65535
其中0~1024为知名端口,是操作系统内部的端口,为系统端口
http:80
ssh:22
https:443
dns:53
五、一些命令
查看协议对应的端口: cat /etc/services
查进程对应的进程号: pidof httpserver
(查看进程名为httpserver对应的进程号)
将进程名为httpserver的所有进程kill掉: pidof httpserver | xargs kill -9
(xargs将 | 前面的结果放到 kill -9后面)
查看本地连接的状态 netstat -nltp
(n能显示为数字的就显示为数字,l 代表连接状态为listen的连接,t代表基于tcp的连接 ,p显示连接对应的进程
netstat -nlup 查看基于udp的连接的状态)
六、一个进程能不能绑定多个端口号,一个端口号能不能被多个进程绑定
一个进程可以绑定多个端口号,数据自底向上交付,到达传输层,一定可以根据端口号交付给绑定端口的进程。保持从端口号到进程映射关系是唯一的。若一个端口号被多个进程绑定了,数据应该交付给进程a,还是交给b进程,这样会有矛盾。若既交给a进程,又交给b进程,那么一个请求就有两份应答,请求方只需要一份应答。
七、对任何一个协议报文的认识
1.如何将报文进行解包(将有效载荷和报头分离)
2.如何分用,就是将报文的有效载荷向上进行交付(根据报头内容进行向上交付)
3.如何将上一层交付下来的报文进行封装传给下一层(添加协议对应的报头)
UDP协议
一、UDP报文格式(结构)
二、报头字段的介绍
源端口:发送方进程bind的端口
目的端口:接受方进程bind的端口
udp的长度:包括报头和有效载荷 最大为216(65535byte) 这就要求应用层将超过udp最大长度的数据,进行分割,分割为小于等于最大长度的数据
校验和:就是对udp报文做检测,检测报文传输过程是否出错,若出错将udp报文丢弃。
三、如何将UDP报文解包和分用
分用就是将有效载荷交付给上一层的进程,每个进程都会实现协议,每个端口都对应一个进程,通过端口找到进程,进程中实现协议。协议和进程和端口号是三位一体的。
如何将传输层的报文进行分用(进行向上交付,交付给对应应用层进程)?
非常简单udp报文的报头是定长的。传输层收到一个来自网络层传送上来的udp报文,传输层会检测这个报文是udp报文,会直接把固定长度(8字节)的报头和有效载荷分离,根据报头中的目的端口号,将有效载荷交付给应用层的进程。
分离后的有效载荷会放在传输层的接受缓冲区,端口号对应的进程通过文件描述符将数据读到。读到之后就可以按照应用协议对有效载荷做处理。
四、传输层如何将应用层数据封装成UDP报文
udp报文中的报头就是操作系统层面定义的结构化数据,报头就是一个结构体,但是不需要进行序列化和反序列化,因为在操作系统层面这些数据就是二进制流。将发送缓冲区里的数据就是有效载荷,将发送缓冲区里的数据加上结构体报头,就构成了UDP报文。
五、UDP报文的特点
无链接、不可靠、面向数据报。
无连接:在应用层写基于udp的代码时,创建套接字,bind传输层的端口,不需要先建立连接,没有listen监听,客户端不需要connect,直接发数据。
不可靠:不保证数据的顺序性,完整性,没有确认机制,没有超时重传机制,没有流量控制和拥塞控制。
面向数据报:在传输层不会将应用层的报文切分(在报文长度不超过UDP最大限制的情况下),而是将整应用报文加上UDP报头向下交付给网络层进行传输。
六、如何满足全双工通信
对于TCP客户端和服务端需要有两对接受缓冲区和发送缓冲区。
服务端发送数据:将数据按应用层协议封装发送到传输层的发送缓冲区,由操作系统内核根据网络状况决定什么时候将发送缓冲区的数据发送出去。数据从发送缓冲区发送,增加tcp报头,构成tcp报文,经过网络协议栈到达物理层网卡,将数字信号转为电信号发送到网络中。客服端网卡收到数据,将数据经过网络协议栈自底向上交付到传输层的,传输层将tcp报文解包,将报头和有效载荷分离,将有效载荷放到接受缓冲。客户端应用层再从接受缓冲区读取应用层报文。
客户端发送数据同理。
对于udp客户端和服务端,保证全双工只需要客户端的接受缓冲区和服务端的接受缓冲。不需要发送缓冲区,因为udp不需要保证可靠性,发送缓冲区储存数据,是为了当出现丢包需要重传时,从发送缓冲区找到丢失的数据进行重传,udp不可靠,不管丢包就无需重传,就不需要发送缓冲区。