Linux网络编程】传输层中的TCP和UDP(UDP篇)

【Linux网络编程】传输层中的TCP和UDP(UDP篇)

目录

  • 【Linux网络编程】传输层中的TCP和UDP(UDP篇)
    • 传输层
      • 再谈端口
      • 端口号范围划分
      • 认识知名端口号
      • netstat
      • iostat
      • pidof
      • xargs
    • UDP协议
      • UDP协议端格式
      • UDP的特点
      • 面向数据报
      • UDP的缓冲数据
      • UDP使用注意事项
      • 基于UDP的应用层协议

作者:爱写代码的刚子

时间:2024.5.11

前言:本篇博客将会深入介绍UDP,了解UDP的机制

传输层

负责数据能够从发送端传输接收端

再谈端口

端口号(Port)标识了一个主机上进行通信的不同的应用程序;

在这里插入图片描述

在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n查看);

在这里插入图片描述

在这里插入图片描述

端口号范围划分

  • 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.

  • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

认识知名端口号

  • ssh服务器, 使用22端口
  • ftp服务器, 使用21端口
  • telnet服务器, 使用23端口
  • http服务器, 使用80端口
  • https服务器,使用443

执行下面的命令可以看见一些知名端口号

  • vim /etc/services查看所有端口号

在这里插入图片描述

所以我们自己写一个程序使用端口号时,要避开这些知名端口号

【问题】:1. 一个进程是否可以bind多个端口号? 2. 一个端口号是否可以被多个进程bind?

  1. 一个进程通常只能绑定一个端口号。端口号是用来标识网络通信中的特定应用程序或服务的,因此一个进程通常只需要一个端口来监听来自其他进程的连接请求或发送数据。但是,在某些情况下,一个进程可能会使用多个端口来处理不同类型的通信,比如一个Web服务器可能同时监听HTTP(端口80)和HTTPS(端口443)连接。
  2. 一般情况下,一个端口号只能被一个进程绑定。这是因为端口号是唯一的,用于标识不同的网络服务或应用程序。 如果多个进程都试图绑定到同一个端口号,通常会导致端口冲突,其中只有一个进程能够成功绑定,而其他进程可能会收到绑定失败的错误。

netstat

netstat是一个用来查看网络状态的重要工具

语法:netstat [选项]

功能:查看网络状态

常用选项:

  • n 拒绝显示别名,能显示数字的全部转化成数字
  • l 仅列出有在 Listen (监听) 的服务状态
  • p 显示建立相关链接的程序名(进程名)
  • t (tcp)仅显示tcp相关选项
  • u (udp)仅显示udp相关选项
  • a (all)显示所有选项,默认不显示LISTEN相关
  • netstat

在这里插入图片描述

  • sudo netstat -nltp完整显示进程名(不隐藏)

在这里插入图片描述

iostat

在这里插入图片描述

iostat 是一个系统性能监控工具,用于报告CPU利用率和设备(磁盘、终端、网络等)的使用情况。它能够提供关于系统I/O活动的详细信息,包括每个磁盘的读写速率、平均响应时间、CPU利用率等。

iostat          # 显示所有设备的统计信息
iostat -d       # 显示磁盘的统计信息
iostat -x       # 显示扩展信息,包括每个设备的更详细的统计数据
iostat -t       # 显示时间戳
iostat -c       # 显示CPU利用率

pidof

在查看服务器的进程id时非常方便.

语法:pidof [进程名]

功能:通过进程名, 查看进程id

  • pidof httpd根据 httpd 这个进程名拿到所有的pid,每个数字代表一个正在运行的 httpd 进程的进程 ID

在这里插入图片描述

xargs

在这里插入图片描述

使用管道时是以标准输入的方式交给kill命令,我们如果想以命令行参数的形式交给kill的话就需要借助xargs命令了

在这里插入图片描述

UDP协议

网络套接字编程时用到的各种接口,是位于应用层和传输层之间的一层系统调用接口,这些接口是系统提供的,我们可以通过这些接口搭建上层应用,比如HTTP。我们经常说HTTP是基于TCP的,实际就是因为HTTP在TCP套接字编程上搭建的。
而socket接口往下的传输层实际就是由操作系统管理的,因此UDP是属于内核当中的,是操作系统本身协议栈自带的,其代码不是由上层用户编写的,UDP的所有功能都是由操作系统完成,因此网络也是操作系统的一部分。

UDP协议端格式

在这里插入图片描述

【问题】:UDP如何将报头和有效载荷进行分离?采用定长报头

【问题】:收到了报文但是如何知道交给上层的哪一个协议?

根据16位(内核和协议确定的)的目的端口号,交给对应的进程。(通过端口号来标定目标进程)

  • 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;
  • 如果校验和出错,就会直接丢弃;

UDP的特点

UDP传输的过程类似于寄信

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
  • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息;
  • 面向数据报:不能够灵活的控制读写数据的次数和数量;

面向数据报

应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;

用UDP传输100个字节的数据:

  • 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节;而不能循环调用10次recvfrom,每次接收10个字节;

UDP的缓冲数据

  • UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作;
  • UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序(乱序就是一种不可靠性)和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;

全双工的概念:UDP的socket既能读,也能写(之前的多线程版的聊天室既能读也能写说明是全双工的)

UDP使用注意事项

我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).
然而64K在当今的互联网环境下, 是一个非常小的数字.
如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;

协议本质是约定,Linux操作系统是用C语言写的,UDP报头其实是自定义结构体(位段),是类型就可以定义变量,开辟空间。操作系统也要对多个同时存在的UDP报文进行管理(sk_buff结构体来管理)。

struct udp_header {uint32_t	src_port:16;	//源端口uint32_t	dst_port:16;	//目的端口uint32_t	length:16;	//数据包长度uint32_t	check_code:16;	//校验和
};
struct sk_buff
{char *start;char *end;char *pos;int type;//...struct sk_buff *next;
};

在这里插入图片描述

操作系统中也存在大量的sk_buff,操作系统采用链表的形式来管理sk_buff

基于UDP的应用层协议

  • NFS: 网络文件系统

  • TFTP: 简单文件传输协议

  • DHCP: 动态主机配置协议

  • BOOTP: 启动协议(用于无盘设备启动)

  • DNS:域名解析协议

也包括自己写的UDP程序时自定义的应用层协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】竞赛常用知识之字符串1

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列(还没学完) 【算法】动态规划之线性DP问题-CSDN博客 【算法】动态规划之背包DP问题(2024…

IP地址定位技术在网络安全中的作用

在当今数字化时代,网络安全已经成为企业、政府和个人面临的重要挑战之一。随着互联网的普及和网络攻击的增加,保护个人隐私和防止网络犯罪变得尤为重要。在这一背景下,IP地址定位技术作为网络安全的重要组成部分之一,发挥着关键作…

宝塔面板Java项目部署,五步轻松搞定

当涉及到正规的开发项目时,最终的上线部署是至关重要的一个环节。本文旨在以最简单便捷的方法来教你如何完成项目的部署工作。 1. SSH下载地址 项目完成后需要使用SSH终端进行项目部署,以确保安全的远程访问、和操作远程服务器。 Xshell (支持Windows系…

JDK8 新日期和时间 API

目录 一、旧版日期时间 API 存在的问题 二、新日期时间 API介绍 三、JDK 8的日期和时间类 LocalDate写法 LocalTime写法 LocalDateTime写法 对日期时间的修改,使用withAttribute方法 日期时间的比较 四、JDK 8的时间格式化与解析 五、JDK 8的 Instant 类 …

Elasticsearch 8.1官网文档梳理 -综述

积累 Elasticsearch 的常用知识,以及日常维护、学习用到的 API。因为相关内容太多,所以根据模块整理成了不同的文章,并在这里做汇总,整个系列的文章都会持续更新 目录 Elasticsearch 8.1官网文档梳理 - 四、Set up Elasticsearc…

树莓派遇到ping的奇葩问题解决办法

首先,先 ping raspberrypi 一下。获得树莓派的ip 然后开始配置静态ip winR后输入命令ipconfig查询当前网关ip 输入命令sudo nano /etc/dhcpcd.conf 在最末尾输入以下信息 -----------------------------------------------------------------------------------…

JavaScript中的事件监听

文章目录 事件监听事件类型鼠标触发类型案例——轮播图表单获得光标类型类型案例——点击搜索框获得下拉表单键盘触发类型效果展示表单输入触发类型案例——统计表单字符数量 事件对象常用属性环境对象回调函数 事件监听 事件:在编程时系统内发生的动作&#xff0c…

ubuntu bind9 主从配置

主配置 (master) # cat /etc/bind/named.conf.local zone "xxx.com" {type master;file "/var/lib/bind/xxx.com.hosts";also-notify {172.17.151.242; // 从IP};};# cat /var/lib/bind/xxx.com.hosts $ttl 3600 xxx.com. I…

多态的学习

1. 🏷多态的概念 多态的概念: 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票…

将Flutter程序打包为ios应用并进行安装使用

如果直接执行flutter build ios: Building com.example.myTimeApp for device (ios-release)...════════════════════════════════════════════════════════════════════════════════No vali…

Web自动化 - selenium

文章目录 一、selenium的使用selenium的安装 二、元素1. 定位选择元素1.id 定位2. class_name 定位find_element 和 find_elements的区别3. TAG_NAME 定位4. 超链接 定位 2. 操控元素1. 查询内容2. 获取元素文本内容3. 获取元素属性 3. 浏览器常用操作API4. 鼠标操作 - perform…

[力扣题解]134. 加油站

题目&#xff1a;134. 加油站 思路 贪心法&#xff1b; 代码 暴力法 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int i, rest, index, size;size gas.size();for(i 0; i < size; i){// 从 i 开始//…

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记

说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务)&#xff0c;所以想着做一个负载均衡&#xff0c;然后多开一些服务&#xff0c;把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务&#xff0c;后来觉得速度不够快&#xff0c;再起了…

DOM 文档对象模型

一、DOM简介 1、什么是DOM DOM 文档对象模型简称&#xff0c;是W3C组织推荐的处理可扩展标记语言的标准编程接口 W3C已经定义了一系列的DOM接口&#xff0c;通过这些接口可以改变网页的内容、结构、样式 2、DOM树 DOM把以上内容都看做是对象 二、获取元素 获取页面元素&am…

day001 ~如何修改主机名

命令行方式设置主机名 # 这个很重要&#xff01;用命令改方便些 hostnamectl set-hostname ocloud-252 #查询&#xff0c;exit或logout重新登录后发现主机名换掉 hostname nmtui方式修改 nmtui 在工作中,如果机器很多,最好修改主机名做好标识不至于弄混,方便管理.

TensorFlow运行bug汇总

1、ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 解决方案 pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/simple 升级或者降级 (TF2.1) C:\Users\Administrator>pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/sim…

LeetCode—用队列实现栈

一.题目 二.思路 1.后入先出的实现&#xff1a; 创建两个队列来实现栈&#xff08;后入先出&#xff09;&#xff1a; 两个队列&#xff0c;保持一个存数据&#xff0c;另一个为空&#xff0c;入数据&#xff08;push&#xff09;要入不为空的队列&#xff0c;&#xff08;p…

DDS块集是如何工作的?

DDS块集使你能够在Simulink中创建DDS应用程序。如果你有一个在Simulink中建模的应用程序&#xff0c;希望能够使用DDS&#xff0c;则可以使用DDS块集轻松连接到DDS中间件平台。 DDS块集将DDS概念引入Simulink环境&#xff0c;在Simulink应用程序中对这些概念进行建模&#xff0…

java实体类中,不对应数据库的实体类字段

TableField(exist false) 是 MyBatis Plus 中的注解&#xff0c;用于标记实体类中的字段是否映射到数据库表中的字段。在这个注解中&#xff0c;exist 属性默认为 true&#xff0c;表示该字段在数据库表中存在。而当设置为 false 时&#xff0c;表示该字段不会映射到数据库表中…

STM32串口通信入门

文章目录 一、串口协议和RS-232标准&#xff0c;以及RS232电平与TTL电平的区别1.串口通信协议2.RS-232标准3.RS232电平与TTL电平的区别4.USB/TTL转232“模块&#xff08;CH340芯片为例&#xff09; 二、补充实验&#xff08;一&#xff09;几个常见的库函数、结构体1.时钟配置函…