计算机网络(八) —— Udp协议

目录

一,再谈端口号

[1.1 端口号](#1.1 端口号)

[1.2 netsta命令](#1.2 netsta命令)

二,UDP协议

[2.1 关于UDP](#2.1 关于UDP)

[2.2 Udp协议格式](#2.2 Udp协议格式)

[2.3 Udp协议特点](#2.3 Udp协议特点)

[2.4 Udp的缓冲区](#2.4 Udp的缓冲区)


一,再谈端口号

http协议本质是"请求 - 响应"形式的协议,但是应用层需要先将数据交给传输层,然后由传输层对数据做进一步处理后再将数据继续向下层交付,最终贯穿整个网络协议栈,最终就发送到了网络当中

传输层负责可靠性传输,确保数据能够可靠地传送到目标地址。

1.1 端口号

  • 在TCP/IP协议中,用"源IP","源端口号","目的IP","目的端口号","协议号"这样一个五元组来标识一个通信
  • 0 - 1023这些端口号被称为知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的(ssh服务器是22端口,ffp是21,telnet是23,smtp邮件协议是25,mysql数据库是3306,这些都是常用的服务器,为了方便使用它们都用固定的端口号)
  • 1024 - 65535是操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个返回分配的

通过netstat命令可以查看到这样地五元组信息:

出了netstat命令,我们也可以查看 /etc/services 文件,查看网络服务名和它们对应使用地端口号和协议:

1.2 netsta命令

netstat命令

这个我们上面已经用过了,是查看网络状态地重要命令,下面是选项介绍:

  • n:拒绝显示别名,能显示数字的全部转为数字
  • l:仅列出处于LISTEN监听状态的服务
  • p:显示建立相关链接的程序名
  • t:仅显示协议号为tcp相关的选项
  • u:仅显示协议号为udp相关的选项
  • a:显示所有选项,默认不显示LISTEN相关

我们查看Tcp相关网络信息时,一般用nltp;查看Udp时,一般用nlup:

二,UDP协议

2.1 关于UDP

我们前面用的各种sock API,都是系统提供的,我们可以通过这些接口搭建上层应用,比如http就是基于Tcp的,因为http就是再Tcp套接字基础上搭建的

应用层往下就是传输层,也是属于操作系统的,所以也由操作系统管理,所以Udp是存在与内核中的,是操作系统的网络协议栈自带的,所以也就是说,Udp所有的功能由操作系统完成

2.2 Udp协议格式

下面是Udp协议报头的图形化:

  • 16位源端口号:表示数据从哪里来
  • 16位目的端口号:表示数据要去哪里
  • 16位UDP长度:表示整个数据报的长度(UDP首部 + UDP数据)
  • 16位UDP校验和:如果UDP报文的检验出错,就会直接将报文丢弃

我们之前就说过,学习任何协议,都要回答下面两个问题:

问题:UDP如何将报头和有效载荷分离?

解答:UDP采用的是定长报头,报头是操作系统加的,所以分离报头时就会简单很多
问题:UDP协议如何将有效载荷交付给上层哪一个协议?

解答: 应用层每一个网络进程都会绑定一个端口,服务器是绑定固定报头,客户端是绑定随机报头,所以UDP就是通过报头当中的"16为目的端口号"来找到对应的进程的,该操作是通过哈希的映射完成的

操作系统是C语言为底层语言,所以UDP协议也一定是用C语言写的,UDP报头实际就是一个位段类型,例如:

cpp 复制代码
struct udp_struct
{
	uint32_t src_port:16;
	uint32_t dst_poet:16;
	uint32_t length:16;
	uint32_t check_code:16;
};
  • 这个东西我们在语言上叫做"位段",在协议上叫做"UDP报头",是自定义类型,是类型,可以定义变量,也可以new开辟空间(struct udp_header h; h.src_port=1234; h.dst=8888等等)

  • 然后操作系统里就存在着大量的UDP报文,先描述再组织,所以操作系统内是有着很多描述报文的结构体的,这个结构体叫做 sk_buff,所以操作系统在封装报文时,先定义一个缓冲区,然后把udp_struct里的东西拷贝进来

  • 然后再把用户要发送的数据拷贝进来,然后sk_buff里面的start指向缓冲区开头,end指向缓冲区结尾,然后我们对还没来得及发的UDP报文用sk_buff描述起来,然后把很多个sk_buff结构体用链表组织起来

  • 当接收缓冲区满了就丢弃UDP,也就是干掉对应的sk_buff然后释放掉udp_struct

  • 把报文往上下层交付,也就是把结构体叫做IP层对应的一套方法,然后对缓冲区的数据再做封装

关于位段可以看咱远古时期的一篇文章:C语言进阶------自定义类型_c语言自义类型-CSDN博客

2.3 Udp协议特点

  • 无连接:知道目的IP和端口就行,直接进行传送,不需要建立连接
  • 不可靠:没有确认机制,也没有重传机制,如果因为网络问题导致数据没有完整发给对方,也不会有任何报错
  • 面向数据报:不够灵活的控制读写数据的次数和数量

面向数据报:应用层交给UDP多长的报文,UDP原样发送,不做任何的拆分和合并

比如用UDP传输100字节的数据:

  • 发送端调用sendto,发100个字节,那么接受端必须调用recvfrom一次接收100个,而不能调用10此recvfrom一次接收10个

2.4 Udp的缓冲区

  • UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,然后再由内核将数据贯穿协议栈进行后续的传输动作
  • UDP具有接收缓冲区,但是一旦缓冲区满了,后续到达的UDP数据会直接丢弃
  • UDP的socket能读能写,所以UDP是全双工的
相关推荐
二货跟班1 小时前
计算机网络
计算机网络
咩咩大主教2 小时前
LinuxC++的UDP服务器和客户端通信
linux·服务器·c语言·开发语言·c++·udp
爱吃涮毛肚的肥肥(暂时吃不了版)2 小时前
计算机网络17——IM聊天系统——客户端核心处理类框架搭建
计算机网络
Tony聊跨境5 小时前
Facebook运营:账号类型有哪些?有必要用静态住宅IP吗?
网络协议·tcp/ip·facebook
Michael的跨境生活大杂烩5 小时前
Facebook直播限流是什么原因?是ip地址导致的吗
网络协议·tcp/ip·facebook
Liveweb视频汇聚平台7 小时前
Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案
websocket·网络协议·音视频·实时音视频·视频编解码
Gabriel Drop Out8 小时前
12年计算机408考研-计算机网络
网络·计算机网络
北飞的山羊9 小时前
【计算机网络】详解UDP套接字&网络字节序&IP地址&端口号
linux·服务器·网络·后端·计算机网络·udp·信息与通信
一个很帅的帅哥20 小时前
axios(基于Promise的HTTP客户端) 与 `async` 和 `await` 结合使用
javascript·网络·网络协议·http·async·promise·await