linux 网络编程Socket(TCP与UDP)

Linux网络编程表: 网络编程的基本操作: 创建网络:使用网络函数创建网络。
绑定地址:通过bind函数将网络绑定到特定的IP地址和端口号。
监听连接:服务器使用监听函数开始监听客户端的连接请求。
建立连接:客户端使用connect函数尝试与服务器建立连接。
Accept Link:服务器通过accept函数接受这个链接请求。
读写数据:使用读写函数在客户端和服务器之间读写数据。
TCP和UDP的主要区别: TCP:可靠性:TCP保证数据包的可靠传输,包括重传丢失的数据和按顺序接收数据。
连接管理:TCP要求连接管理进程在数据传输前后进行3 次握手、4 次挥手。
Mission 语法:适合需要可靠传输的应用,如 HTTP、FTP 等。
UDP:无连接:UDP 不需要连接来发送数据,因此具有较低的延迟。
不可靠性:UDP不保证数据包的到达、顺序和完整性,发送后也不给出任何确认。
语法场景:适合实时性要求高,但数据可靠性要求不高的应用,例如视频流、实时通信等。
在Linux网络编程中,根据应用的需要选择合适的协议层和合适的Socket编程模型是实现高效、可靠或实时网络通信的关键。

Linux fd 系列 — socket fd 是什么?

在Linux系统上,socketfd是一个网络文件句柄,本质上是一个用于网络通信的文件句柄。
广泛应用于C/S客户端和服务器端编程模型中,实现网络数据的读写操作。
网络通信接口和文件读写接口虽然有细微的区别,但本质上都是I/O操作,即数据的输入和输出。
例如,如果我们查看进程的文件描述符,我们会发现它包含两个文件,套接字7 和8 ,其名称为“socket:[1 8 8 9 2 ]”。
该名称包含有关 fd 类型的信息,类似于紧跟在 fd 文件后面的路径名。
这个inode号也可以在其他地方看到,例如在proc目录的net子目录中。
对于使用TCP协议的服务器,我们可以查看连接状态的相关信息。
事实上,套接字和文件描述符在功能上没有显着差异。
两者都可以实现基本的I/O操作。
在理解Socketfd时,我们必须将其与TCP/IP协议栈区分开来。
虽然TCP/IP协议栈是网络通信的基础,但是在进行网络编程时,操作系统的socket接口更加直观、实用。
在描述Socketfd时,我们首先需要了解环境和术语。
Linux内核版本是4 .1 9 除非特别指定协议,否则假定 TCP 是默认协议。
socket是Linux网络编程中用于指代套接字接口的通用术语。
网络模型通常包括网络协议栈的不同层,每一层执行特定任务并通过连续封装提供更高级别的功能。
在Linux环境中,网络编程通常被称为套接字编程,因为套接字接口为程序员提供了与网络通信相关的简化接口。
例如,开发一个基于TCP的C/S网络程序,主要涉及socket的创建、读取、写入和关闭。
Socket的创建是通过socket函数(intdomain、inttype、intprotocol)实现的,这与获取文件描述符相同。
网络模型通常分为两层:顶层是应用层,底层是协议层。
不同层之间的封装使得应用层程序员可以专注于业务逻辑,而不必担心底层细节。
在 Linux 系统上,套接字位于所有网络协议之上,并提供用于执行网络通信操作的单一接口。
监听套接字和常规套接字是两种不同的类型。
侦听套接字仅用于管理连接建立,而常规套接字用于流数据。
监听套接字关注读事件中连接队列的非空状态,而常规套接字关注读写事件。
为了让socket fd具有文件描述符语义,Linux内核实现了sockfs文件系统。
该系统为套接字提供了统一的接口,与 eventfd、ext2 fd 和其他描述符一样,提供了外部 I/O 操作的一致性。
sockfs文件系统的核心在于全局变量sock_mnt中的超级块操作表sockfs_ops,它决定了inode的分配规则。
通过了解inode与特定文件系统(如ext4 )的关系,我们发现inode是一个抽象的vfs结构,适应所有文件系统,由特定文件系统分配。
在Linux中,inode与不同文件系统中的特定结构(例如ext4 _inode_info)相关联,并通过强制类型转换在不同级别之间切换。
同样,sockfs文件系统也有自己的“inode”结构,即structsocket_alloc。
该结构链接套接字和索引节点,是核心文件抽象之一。
socket创建过程实际上创建了一个structsocket_alloc结构体,并返回其中的socket字段地址。
在编写socket时,我们需要关注服务器端和客户端的几个关键函数。
服务器主要包括包括socket、绑定、监听、接受等功能;客户端通常使用socket、connection等功能。
下面简单介绍一下这些功能的实现。
socket函数主要负责创建socket并根据协议族找到对应的操作表。
内核涉及的函数调用有sock_create、sock_init_data等,这些函数初始化socket结构体,包括初始化接收队列和发送队列,设置socket唤醒回调。
bind函数用于将套接字绑定到特定的IP地址和端口号。
对于客户端,虽然可以强制绑定,但通常没有必要,因为内核在连接时会自动选择端口号。
服务器必须使用绑定来显式指定 IP 地址和侦听端口。
Listen函数将常规套接字转换为监听套接字,以便该套接字可以接收连接请求。
Listen系统调用执行的主要任务是使套接字进入监听状态,并在连接请求队列中等待新的连接。
Accept函数从连接队列中接受一个新的连接并返回一个新的套接字句柄。
当侦听套接字可读时,意味着新连接可用,将调用accept函数来处理这些连接。
最后我们看了一下socket和文件描述符的关系,以及如何利用epoll机制实现对socket事件的高效控制。
epoll机制允许我们注册一个Socketfd并监听其读写事件,从而实现高效的异步I/O操作。
通过了解Socketfd的实现及其相关函数,我们可以更深入地了解Linux网络编程技能。

linux ioctl函数详解「建议收藏」

Linux ioctl函数详解: Linux网络程序与内核交互的主要方法是ioctl函数,它允许程序与内核的网络协议栈进行交互,实现各种网络相关的操作。
下面是ioctl函数的详细介绍: 相关结构: ifreq结构: 用途: 用于网络接口查询。
包含信息:接口名称、IP地址、子网掩码、MAC地址等。
ifmap结构: 目的:描述网卡设备映射属性。
包含信息:内存的起始地址、结束地址等。
ifconf 结构体: 用途:用于网络配置。
特征:包含接口请求指针的缓冲区。
arpreq结构体: 用途:用于ARP缓存操作。
包含信息:IP地址、硬件地址和操作命令。
查询代码: 内容:查询代码包括几类,如套接字操作、文件操作、路由操作、流操作等。
具体查询:获取网络接口、网络配置、ARP缓存管理等信息。
功能及应用: 获取网络接口信息:通过ioctl函数以及相应的查询代码和结构,程序可以从网络接口获取各种信息,如IP地址、子网掩码、MAC地址等。
配置网络接口:ioctl函数允许程序修改网络配置。
接口,例如设置新的 IP 地址或子网掩码。
查看和修改ARP缓存:通过ioctl函数和arpreq结构体,程序可以查询或修改ARP缓存条目,这对于网络故障排除和优化非常重要。
重要性:对于开发人员和网络维护人员来说,了解 ioctl 函数、其结构和相关查询代码至关重要。
这些机制可以帮助开发者更好地理解Linux网络编程的底层实现,从而更高效地开发和维护网络应用。
通过掌握ioctl函数及其相关查询结构和代码,开发人员可以实现对网络接口的高级控制,包括读取和修改关键信息以及与ARP缓存交互,这对于网络编程和应用程序开发具有重要意义。