| |
|
开发:
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以统一的、安全的方式进行网络数据传输。
?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的结构体,有两个成员: 常用地址族及其对应的协议族: 宏 PF_* 和 AF_* 都定义在 bits/socket.h 头文件中,且后者与前者有完全相同的值,所以二者通常混用。? 协议族对应的地址值解读方式: 由上表可知,14 字节的 sa_data 根本无法容纳多数协议族的地址值。因此,Linux 定义了新的通用的 socket 地址结构体-sockaddr_storage,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的:
5.专用socket地址和通用socket地址因网络通信技术的发展,曾经的sockaddr无法兼容现代诸多协议下的数据,比如上文中IPv4的协议族,如果使用sockaddr结构体对其地址值赋值则相当麻烦(因为sa_data是一整块连续空间,需要把意义不同的数据放进去,则要设置0-1byte放端口号,2-5byte放IP地址),而IPv6协议族的地址值甚至无法用sockaddr装下。 因此现在sockaddr和sockaddr_storage都被视为一种通用的socket地址,而新定义了诸多专用于各个协议的专用socket结构体,在调用相关函数时需要将专用socket地址强制转换为通用socket地址类型。
? ?参考: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/15 12:33:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |