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

2024-05-13 08:36

本文主要是介绍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程序时自定义的应用层协议

这篇关于Linux网络编程】传输层中的TCP和UDP(UDP篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985197

相关文章

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Linux使用粘滞位 (t-bit)共享文件的方法教程

《Linux使用粘滞位(t-bit)共享文件的方法教程》在Linux系统中,共享文件是日常管理和协作中的常见任务,而粘滞位(StickyBit或t-bit)是实现共享目录安全性的重要工具之一,本文将... 目录文件共享的常见场景基础概念linux 文件权限粘滞位 (Sticky Bit)设置共享目录并配置粘

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip