网络编程——socket定义和地址格式

news2025/1/6 20:28:47

网络编程——socket定义和地址格式


目录

  1. socket 是什么?
  2. 套接字地址格式

1. socket 是什么?

在这里插入图片描述

  1. 网络编程中, socket 翻译为套接字或套接口,指可以通过插口接入的方式,快速完成网络连接和数据收发。
  2. 上图表示网络编程中,客户端和服务器工作的核心逻辑。
  3. 服务器端,在客户端发起连接请求之前,服务器端必须初始化好。
    1. 初始化 socket。
    2. 执行 bind 函数,将服务能力绑定在一个可知的地址和端口上。
    3. 然后执行 listen 操作,将原先的 socket 转化为服务端的 socket。
    4. 服务端最后阻塞在 accept 上等待客户端请求。
  4. 当服务器端已经准备就绪,客户端需要先初始化 socket,再执行 connect 向服务器端的地址和端口发起连接请求,这里的地址和端口必须是客户端预先知道的。connect请求就是TCP 三次握手(Three-way Handshake)。
  5. 三次握手完成后,客户端和服务器端建立连接,就进入了数据传输过程。
    1. 客户端进程向操作系统内核发起 write 字节流写操作,内核协议栈将字节流通过网络设备传输到服务器端,服务器端从内核得到信息,将字节流从内核读入到进程中,并开始业务逻辑的处理,完成之后,服务器端再将得到的结果以同样的方式写给客户端。
    2. 所以一旦连接建立,数据的传输就不再是单向的,而是双向的
  6. 当客户端完成和服务器端的交互后,比如执行一次 Telnet 操作,或者一次 HTTP 请求,需要和服务器端断开连接时,就会执行 close 函数。
    1. 操作系统内核此时会通过原先的连接链路向服务器端发送一个 FIN 包,服务器收到之后执行被动关闭,这时候整个链路处于半关闭状态。
    2. 此后,服务器端也会执行 close 函数,整个链路才会真正关闭。
    3. 半关闭的状态下,发起 close 请求的一方在没有收到对方 FIN 包之前都认为连接是正常的。
    4. 而在全关闭的状态下,双方都感知连接已经关闭。
  7. 以上所有的操作,都是通过 socket 来完成的。无论是客户端的 connect,还是服务端的 accept,或者 read/write 操作等,socket 是用来建立连接,传输数据的唯一途径

2. 套接字地址格式

  1. 在使用套接字时,首先要解决通信双方寻址的问题,需要套接字的地址建立连接,套接字的地址格式如下。

1. 通用套接字地址格式

  1. 套接字的通用地址结构:
/* POSIX.1g 规范规定了地址族为 2 字节的值.  */
typedef unsigned short int sa_family_t;
/* 描述通用套接字地址  */
struct sockaddr{
    sa_family_t sa_family;  /* 地址族.  16-bit*/
    char sa_data[14];   /* 具体的地址值 112-bit */
}; 
  1. 第一个字段是地址族,表示使用什么样的方式对地址进行解释和保存。地址族在 glibc 里的定义非常多,常用的有以下几种:
    • AF_LOCAL:表示的是本地地址,对应的是 Unix 套接字,一般用于本地 socket 通信,也可以写成 AF_UNIX、AF_FILE。
    • AF_INET:因特网使用的 IPv4 地址。
    • AF_INET6:因特网使用的 IPv6 地址。
  2. AF_ 表示的含义是 Address Family, PF_表示Protocol Family协议族,比如 PF_INET、PF_INET6 等。用 AF_xxx 的值来初始化 socket 地址,用 PF_xxx 的值来初始化 socket。在 <sys/socket.h> 头文件中可以看到,这两个值是一一对应的。
/* 各种地址族的宏定义  */
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL  PF_LOCAL
#define AF_UNIX   PF_UNIX
#define AF_FILE   PF_FILE
#define AF_INET   PF_INET
#define AF_AX25   PF_AX25
#define AF_IPX    PF_IPX
#define AF_APPLETALK  PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25    PF_X25
#define AF_INET6  PF_INET6
  1. sockaddr 是一个通用的地址结构,适用于多种地址族。

2. IPv4 套接字格式地址

  1. 常用的 IPv4 地址族的结构:
//IPV4 套接字地址,32bit 值.
typedef uint32_t in_addr_t; 
struct in_addr
  {
    in_addr_t s_addr;
  };
  
struct sockaddr_in //描述 IPV4 的套接字地址格式
  {
    sa_family_t sin_family; 	//16-bit */
    in_port_t sin_port;     	//端口口  16-bit
    struct in_addr sin_addr;    //Internet address. 32-bit
 
    unsigned char sin_zero[8]; 	//这里仅仅用作占位符,不做实际用处
  };
  1. 和 sockaddr 一样,都有一个 16-bit 的 sin_family 字段,对于 IPv4 来说值为 AF_INET。
  2. 端口号,端口号最多是 16-bit,即最大支持 2 的 16 次方(65535)。
    1. 保留端口是约定俗成的,已经被对应服务使用的端口,比如 ftp 的 21 端口,ssh 的 22 端口,http 的 80 端口等。
    2. 一般大于 5000 的端口可以作为自己应用程序的端口使用。
  3. 下面是 glibc 定义的保留端口。
/* Standard well-known ports.  */
enum
  {
    IPPORT_ECHO = 7,    /* Echo service.  */
    IPPORT_DISCARD = 9,   /* Discard transmissions service.  */
    IPPORT_SYSTAT = 11,   /* System status service.  */
    IPPORT_DAYTIME = 13,  /* Time of day service.  */
    IPPORT_NETSTAT = 15,  /* Network status service.  */
    IPPORT_FTP = 21,    /* File Transfer Protocol.  */
    IPPORT_TELNET = 23,   /* Telnet protocol.  */
    IPPORT_SMTP = 25,   /* Simple Mail Transfer Protocol.  */
    IPPORT_TIMESERVER = 37, /* Timeserver service.  */
    IPPORT_NAMESERVER = 42, /* Domain Name Service.  */
    IPPORT_WHOIS = 43,    /* Internet Whois service.  */
    IPPORT_MTP = 57,
 
 
 
 
    IPPORT_TFTP = 69,   /* Trivial File Transfer Protocol.  */
    IPPORT_RJE = 77,
    IPPORT_FINGER = 79,   /* Finger service.  */
    IPPORT_TTYLINK = 87,
    IPPORT_SUPDUP = 95,   /* SUPDUP protocol.  */
 
 
    IPPORT_EXECSERVER = 512,  /* execd service.  */
    IPPORT_LOGINSERVER = 513, /* rlogind service.  */
    IPPORT_CMDSERVER = 514,
    IPPORT_EFSSERVER = 520,
 
 
    /* UDP ports.  */
    IPPORT_BIFFUDP = 512,
    IPPORT_WHOSERVER = 513,
    IPPORT_ROUTESERVER = 520,
 
 
    /* Ports less than this value are reserved for privileged processes.  */
    IPPORT_RESERVED = 1024,
 
 
    /* Ports greater this value are reserved for (non-privileged) servers.  */
    IPPORT_USERRESERVED = 5000
  1. IPv4 地址是一个 32-bit 的字段,最多支持的地址数是 2 的 32 次方,大约是 42 亿。

3. IPv6 套接字地址格式

  1. IPv6 的地址结构:
struct sockaddr_in6
  {
    sa_family_t sin6_family; 	//16-bit
    in_port_t sin6_port;  		//传输端口号 # 16-bit 
    uint32_t sin6_flowinfo; 	//IPv6 流控信息 32-bit
    struct in6_addr sin6_addr;  //IPv6 地址 128-bit
    uint32_t sin6_scope_id; 	//IPv6 域 ID 32-bit
  };
  1. 整个结构体长度是 28 个字节,其中流控信息和域 IP 一个在 glibc 的官网上没出现,另一个是当前未使用的字段。地址族是 AF_INET6,端口同 IPv4 地址一样,关键的地址从 32 位升级到 128 位,完全解决了寻址数字不够的问题。
  2. IPv4 和 IPv6 的地址格式都是因特网套接字的格式,还有一种本地套接字格式,用来作为本地进程间的通信, 即 AF_LOCAL。
struct sockaddr_un {
    unsigned short sun_family; 	//固定为 AF_LOCAL
    char sun_path[108];   		//路径名
};

4. 几种套接字地址格式比较

  1. 几种地址的比较见下图,IPv4 和 IPv6 套接字地址结构的长度是固定的,而本地地址结构的长度是可变的。

image.png

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

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

相关文章

智能终端测试解决方案

概述 随着互联网产业的蓬勃发展&#xff0c;智能终端的崛起&#xff0c;无论是移动终端制造商、移动通信运营商以及移动互联网内容服务商&#xff0c;都面临着新技术、新业务、新服务不断涌现&#xff0c;商用进程不断加快的局面。 当前基于5G核心技术的移动传输网络已开发出…

只因简历上有“精通”Redis,阿里三面被面试官狂问 Redis,再也不敢乱写了

Redis 在国内各大公司都很热门&#xff0c;比如新浪、阿里、腾讯、百度、美团、小米等。Redis 也是大厂面试最爱问的&#xff0c;尤其是 Redis 客户端、Redis 高级功能、Redis 持久化和开发运维常用问题探讨、Redis 复制的原理和优化策略、Redis 分布式解决方案等。 Redis 我们…

Python 字符串详解

一、字符串概念 用于保存字符信息的数据模型(容器)。 1、只能存放一个值 2、不可变类型 3、有序&#xff0c;索引从0开始顺序访问 字符串语法格式&#xff1a; str1 “字符串信息” str2 字符串信息 str3 字符串信息 str4 字符串信息 二、字符串常用操作 1、字符串…

【论文阅读】社交网络传播最大化问题-02

Leader-Based Community Detection Algorithmin Attributed Networks以往leader-aware算法创新点问题定义定义基础概念定义创新概念模型构造第一步&#xff1a;确定每个节点的leader第二步&#xff1a;合并小分支以得到最终结果实验数据集人工合成网络现实世界的网络基线方法和…

leetcode:2478. 完美分割的方案数【预处理 + dp定义 + 前缀和优化】

目录题目截图题目分析ac code总结题目截图 题目分析 开头必定是prime&#xff0c;结尾必定是not primek 1特判找到所有可能的结尾点&#xff08;最后一个不考虑&#xff09;结尾点i必须满足s[i]->not prime, s[i 1]->prime设结尾点集合为x0 < x1 < x2 < … &…

Docker的容器管理

1、创建容器 容器创建&#xff1a;就是将镜像加载到容器的过程。 创建容器时如果没有指定容器名称&#xff0c;系统会自动创建一个名称。 新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 docker create创建的容器…

MCE | ROS 与疾病的关系

前段时间&#xff0c;一篇刊登在国际杂志 Cell Metabolism 上的研究报告表明&#xff0c;从表型正常的细胞转化为癌变细胞或许涉及抗氧化剂防御 (Antioxidant defense) 和核苷酸合成 (Nucleotide synthesis) 两个部分&#xff0c;而突破这些限制可能是致癌转化的关键。文中通过…

oracle常见报错问题处理

文章目录协议适配器错误怎么办&#xff1f;忘记密码了怎么办&#xff1f;报错:ora-01033oracle initialization or shutdown in progress&#xff1b;edit无法使用怎么办&#xff1f;报错:ORA-28547:connection to server failed,probable Oracle Net admin errorORA-12505:监听…

大一学生HTML期末作业_ 季奥林匹克运动会 8页 无js 带表单 带报告5200字

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园篮球网页设计 | 足球体育运动 | 体育游泳运动 | 兵乓球 | 网球 | 等网站的设计与制作HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&…

让你全方位了解Shell终端,轻松学习

关于shell终端&#xff0c;本文将在以下几个方面做以总结和说明&#xff0c;希望对大家有所帮助。 1.什么是shell Shell是用户和Linux操作系统之间的接口。Linux中有多重shell&#xff0c;其中缺省使用的是Bash。如果把Linux内核想象成一个球体的中心&#xff0c;shell就是围绕…

[go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册

1.实现功能-完成用户登录 在redis手动添加测试用户,并画出示意图以及说明注意事项(后续通过程序注册用户) 如:输入用户名和密码,如果在redis中存在并正确,则登录,否则退出系统,并给出相应提示: 提示信息: 1.用户不存在或者密码错误 2.重新注册并登录 redis手动添加测试用户 ser…

GitLab的使用

目录 一、腾讯云 / 阿里云 购买服务器 二、服务器上安装GitLab-ce 三、使用git 1、首先把服务器上的代码克隆下来 2、将所有有改动的全部添加到要提交的本地库中 3、将修改提交到本地库 4、将本地库的commit推送到远程服务器 5、拉取服务器上最新资源&#xff1a; 6、…

智创未来 · 引领5G价值,广和通携5G AIoT创新应用亮相2022德国慕尼黑电子展

11月15-18日&#xff0c;两年一届的全球电子行业盛会——德国慕尼黑电子展&#xff08;Electronica 2022&#xff09;于慕尼黑展览中心顺利举行。作为全球领先的物联网无线通信解决方案和无线模组供应商&#xff0c;广和通精彩亮相B5馆139展台&#xff0c;向全球物联网企业分享…

机器学习分类模型评价指标之ROC 曲线、 ROC 的 AUC 、 ROI 和 KS

前文回顾&#xff1a; 机器学习模型评价指标之混淆矩阵机器学习模型评价指标之Accuracy、Precision、Recall、F-Score、P-R Curve、AUC、AP 和 mAP 1. 基本指标 1.1 True Positive Rate(TPR) TPRTPTPFNTPR \frac{TP}{TPFN}TPRTPFNTP​ 中文&#xff1a;真正率、灵敏度、召…

一天快速掌握Mybaits[一]

一、搭环境 Spring Initializr的搭建 创建完毕后的项目结构 此时application的后缀更名为yml&#xff0c;因为这样&#xff0c;看起来更简洁明了&#xff0c;而作用上&#xff0c;无差别 数据库环境的搭建 新建数据库 执行SQL语句 use mybatis-demo; CREATE TABLE user (id…

珠海航展有图扑 | 数字孪生方案助力智慧航天

2022 年 11 月 8 日~11 月 15 日&#xff0c;在第十四届中国国际航空航天博览会&#xff08;简称中国航展&#xff09;中&#xff0c;图扑先进的数字孪生解决方案&#xff0c;支撑合作伙伴实现人机交互场景。 图扑助力航展数字化 在本届国际航空航天博览会中&#xff0c;图扑…

Word控件Spire.Doc 【图像形状】教程(2) ;在 C#、VB.NET 中从 Word 中提取图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

代码演示GC回收

JVM配置 -XX:NewSize5m 初始新生代大小 -XX:MaxNewSize5m 最大新生代大小 -XX:InitialHeapSize10m 初始堆大小 等同于Xms -XX:MaxHeapSize10m 最大堆大小 等同于Xmx -XX:SurvivorRatio8 Eden区占80% -XX:PretenureSizeThreshold10m 大对象阈值 -XX:UseParNewGC 新生代使用ParN…

最新最全面的Spring详解(五)——事务管理

前言 本文为 【Spring】事务管理 相关知识&#xff0c;下边将对Spring框架事务支持模型的优点&#xff0c;Spring框架的事务抽象的理解&#xff08;包含TransactionManager、TransactionDefinition、TransactionStatus&#xff0c;编程式事务管理&#xff08;包含使用 Transact…

(七)笔记.net core学习之反射、加载dll、读取moudle、类、方法、特性

1.反射加载dll、读取moudle、类、方法、特性 &#xff08;1&#xff09;模块信息获取 &#xff08;2&#xff09;方法调用 2.反射创建对象、反射简单工厂配置文件&#xff08;破坏单例&#xff0c;创建泛型&#xff09; &#xff08;1&#xff09;程序的可配置可扩展&#xf…