IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> socket(套接字)与socket地址 -> 正文阅读

[系统运维]socket(套接字)与socket地址

要了解socket,首先要了解TCP/IP四层模型。

1.TCP/IP四层模型

TCP/IP四层模型是对OSI七层模型的简化,其自顶向下包含四层,分别是应用层、传输层、网络层、链路层。其中的每一层都有若干规则保障其与上下层级进行交互,也就是协议,进行通信的双方必须遵循协议才能顺利、高效的收发数据。在这些协议中,位于传输层的TCP协议和位于网络层的IP协议是使用频率最高,适用范围最广的协议,因此TCP/IP四层模型中的协议被统称为TCP/IP协议族

2.什么是socket?

socket是位于应用层和传输层中间的中介,向上,socket负责接收应用层进程将要通过网络发出的数据和传递由网络过来发给进程的数据;向下,socket负责接收传输层发送过来的数据和发送进程将要利用网络发出的数据。socket可以看作是网络通信两端的接口,在Linux中,其本质是一种文件,记录了端的相关信息。也就是说,应用层和传输层之间不会直接面对面交流,而是通过socket以统一的、安全的方式进行网络数据传输。

为什么Linux中的socket被视作一种文件类型?

在Linux中所有的文件都有文件描述符,socket被视为一种文件的好处就在于Linux系统可以通过文件描述符,像操作一般文件一样操作socket,这就保持了Linux操作文件和socket的统一性。

?3.socket有什么类型?

socket套接字存在多种类型,我们常用的是DARPA Internet套接字。根据数据的传输方式,Internet套接字也存在多种类型,其中常见的有两种,即流格式套接字(SOCK_STREAM)数据报格式套接字(SOCK_DGRAM)

流格式套接字(SOCK_STREAM):

流格式套接字底层遵循TCP协议,因此其具有TCP协议的诸多特点,即不丢失,不乱序,异步收发(即数据的发送和接受不是同步的,TCP中数据可能分批到达,可以等待全部数据到达后再统一接收,这由TCP设置的缓冲区来保证)

在http协议中所使用的就是流格式套接字,因为html文件必须准确无误的被加载。

数据报格式套接字(SOCK_DGRAM):

数据报格式套接字底层遵循UDP协议,因此其具备UDP协议的特点,即可丢失损毁,限制单次传输数据大小,同步收发(对比TCP的异步收发,UDP中要求送达的数据必须马上接收,无论其是否是一个完整数据的一部分)

4.socket地址

网络通信的本质是进程间通信,因此在进行网络通信的进程双方必须知道对方的进程端口号IP等信息,socket地址就是一种记录这些信息的数据结构

socket地址在socket网络编程API中是名为sockaddr的结构体,有两个成员:
1.sa_family表示通信双方的地址族
2.sa_data表示socket地址值。根据地址族的不同,对地址值的解读方式也就不同。

常用地址族及其对应的协议族:

宏 PF_* 和 AF_* 都定义在 bits/socket.h 头文件中,且后者与前者有完全相同的值,所以二者通常混用。?

协议族对应的地址值解读方式:

由上表可知,14 字节的 sa_data 根本无法容纳多数协议族的地址值。因此,Linux 定义了新的通用的 socket 地址结构体-sockaddr_storage,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的:


同时,为了方便为sockaddr和sockaddr_storage赋值,定义了专用socket地址结构体。

5.专用socket地址和通用socket地址

因网络通信技术的发展,曾经的sockaddr无法兼容现代诸多协议下的数据,比如上文中IPv4的协议族,如果使用sockaddr结构体对其地址值赋值则相当麻烦(因为sa_data是一整块连续空间,需要把意义不同的数据放进去,则要设置0-1byte放端口号,2-5byte放IP地址),而IPv6协议族的地址值甚至无法用sockaddr装下。

因此现在sockaddr和sockaddr_storage都被视为一种通用的socket地址,而新定义了诸多专用于各个协议的专用socket结构体,在调用相关函数时需要将专用socket地址强制转换为通用socket地址类型。

具体来说,以socket API中的bind()函数为例,?

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

其中第二个参数需要指定socket地址,形参类型为struct sockaddr*,而如果使用的是IPv4协议,则可以传递实参数据类型为struct sockaddr_in的结构,并进行强制类型转换:

struct sockaddr_in sinaddr;
bind(...,(struct sockaddr*)&sinaddr,...);

?

?参考:

socket是什么?套接字是什么?

登录—专业IT笔试面试备考平台_牛客网

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 11:10:24  更:2022-07-03 11:14:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 22:04:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码