Linux--Socket编程预备

目录

1. 理解源 IP 地址和目的 IP 地址

2.端口号 

2.1端口号(port)是传输层协议的内容

2.2端口号范围划分

2.3理解 "端口号" 和 "进程 ID"

2.4理解 socket

 3.传输层的典型代表

3.1认识 TCP 协议

3.2认识 UDP 协议

4. 网络字节序

 5. socket 编程接口


1. 理解源 IP 地址和目的 IP 地址

IP 在网络中, 用来标识主机的唯一性
• 注意: 后面我们会讲 IP 的分类, 后面会详细阐述 IP 的特点
但是这里要思考一个问题: 数据传输到主机是目的吗? 不是的。 因为数据是给人用
的。 比如: 聊天是人在聊天, 下载是人在下载, 浏览网页是人在浏览?
但是人是怎么看到聊天信息的呢? 怎么执行下载任务呢? 怎么浏览网页信息呢? 通过
启动的 qq, 迅雷, 浏览器。
而启动的 qq, 迅雷, 浏览器都是进程。 换句话说, 进程是人在系统中的代表, 只要把
数据给进程, 人就相当于就拿到了数据。
所以: 数据传输到主机不是目的, 而是手段。 到达主机内部, 在交给主机内的进程,
才是目的。
但是系统中, 同时会存在非常多的进程, 当数据到达目标主机之后, 怎么转发给目标
进程? 这就要在网络的背景下, 在系统中, 标识主机的唯一性。


2.端口号 

2.1端口号(port)是传输层协议的内容

  • 端口号是一个 2 字节 16 位的整数;
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  • IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;(互联网中独一无二的一个进程),网络通信的本质就是进程间通信,只是需要跨网络。(进程间通信要满足的条件:1.两个进程具有独立性(绝对的满足) 2.两个进程间要看到一个公共资源:网络),因此我们基于   IP+PORT 的通信 称之为Socket通信
  • 一个端口号只能被一个进程占用.且一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定。


2.2端口号范围划分

0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的
端口号都是固定的.
1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作
系统从这个范围分配的.


2.3理解 "端口号" 和 "进程 ID"

        我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也
是唯一表示一个进程. 那么这两者之间是怎样的关系?
        进程 ID 属于系统概念, 技术上也具有唯一性, 确实可以用来标识唯一的一个进
程, 但是这样做, 会让系统进程管理和网络强耦合(pid每次启动的时候都会发送变化,那么两者之间有联系,意味着网络部分也要发送变化), 实际设计的时候, 并没有选择这
样做。我们要实现解耦,系统就是系统,网络就是网络,所以引入了端口号。

        但在系统中不是所有进程都有端口号,所有进程都有pid,只有需要进行网络通信的进程才有端口号。


理解源端口号和目的端口号
        传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号.
就是在描述 "数据是谁发的, 要发给谁"


2.4理解 socket

  • 综上, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程
  •  IP+Port 就能表示互联网中唯一的一个进程
  • 所以, 通信的时候, 本质是两个互联网进程代表人来进行通信, {srcIp,srcPort, dstIp, dstPort}这样的 4 元组就能标识互联网中唯二的两个进程
  •  所以, 网络通信的本质, 也是进程间通信
  • 我们把 ip+port 叫做套接字 socket


 3.传输层的典型代表

        如果我们了解了系统, 也了解了网络协议栈, 我们就会清楚, 传输层是属于内核
的, 那么我们要通过网络协议栈进行通信, 必定调用的是传输层提供的系统调用, 来
进行的网络通信


3.1认识 TCP 协议

此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;
后面我们再详细讨论 TCP 的一些细节问题.
• 传输层协议
• 有连接
• 可靠传输(可靠性高)
• 面向字节流


3.2认识 UDP 协议

此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后
面再详细讨论.
• 传输层协议
• 无连接
• 不可靠传输(但操作简单)
• 面向数据报
 


4. 网络字节序

        我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的
多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之
分. 那么如何定义网络数据流的地址呢?

  •  发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  •  接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  •  因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  • TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
  • 不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

        但后面是有了规定:网络中通信,必须大端! 为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运
行,可以调用以下库函数做网络字节序和主机字节序的转换。

• 这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数。
• 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地址转换后准备发送。
• 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
• 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。


 


 5. socket 编程接口

socket 常见 API
 

C /
/ 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockaddr 结构
        socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、 IPv6,以及
后面要使用的 UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同。

• IPv4 和 IPv6 的地址格式定义在 netinet/in.h 中,IPv4 地址用 sockaddr_in 结构
体表示,包括 16 位地址类型, 16 位端口号和 32 位 IP 地址.
• IPv4、 IPv6 地址类型分别定义为常数 AF_INET、 AF_INET6. 这样,只要取得某
种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可
以根据地址类型字段确定结构体中的内容.
• socket API 可以都用 struct sockaddr *类型表示, 在使用的时候需要强制转化成
sockaddr_in; 这样的好处是程序的通用性, 可以接收 IPv4, IPv6, 以及 UNIX Domain
Socket 各种类型的 sockaddr 结构体指针做为参数;(这就是C语言版本的多态,头部结构一致,因此可以接收不同的结构体)
sockaddr 结构

sockaddr_in 结构
虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结
构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP 地址
in_addr 结构

in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数;
 

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

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

相关文章

应用产品的通信测试

当前所在公司为物联网产品,研发端没有真正的通信协议栈自主研发、也没有真正懂协议及协议实现的人。基本都是靠着供应商的指导和定位在做通信类开发。但日常中遇到的问题确实很细很底层的,特别是对研发和测试人员来说,遇到一个问题肯定是希望…

【数据结构】包装类、初识泛型

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

Selenium之execute_script()方法执行js脚本

目录 场景应用和使用 页面滚动 获取返回值 返回JavaScript定位的元素对象 修改元素属性 弹出提示框 场景应用和使用 在自动化测试中,部分场景无法使用自动化Selenium原生方法来进行测试: 滚动到某个元素(位置) 修改…

Unity UGUI 之 Slider

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Slider是什么 滑块,由三部分组成:背景 填充条 手柄 填充条就是…

【打工日常】使用Prometheus+Grafana+Alertmanager+Webhook-dingtalk搭建监控平台

一、监控平台介绍1.监控平台简述普罗米修斯四件套,分别为Prometheus、Grafana、Alertmanager、Webhook-DingTalk。Prometheus一套开源的监控&报警&时间序列数据库的组合,由SoundCloud公司开发,广泛用于云原生环境和容器化应用的监控和性能分析。其提供了通用的数据模…

《昇思 25 天学习打卡营第 20 天 | Pix2Pix实现图像转换 》

《昇思 25 天学习打卡营第 20 天 | Pix2Pix实现图像转换 》 活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp 签名:Sam9029 Pix2Pix模型概述 Pix2Pix是一种基于条件生成对抗网络(cGAN)的图像转换模型&#x…

无人机侦察:一维相扫雷达技术详解

一维相扫雷达技术,即相位扫描雷达技术,在无人机侦察中扮演着重要角色。该技术通过在雷达发射天线上施加变化的相位差,使天线波束在固定平面内进行一维扫描,从而实现对目标区域的搜索和跟踪。与传统的机械扫描雷达相比,…

本地部署SearXNG

SearXNG SearXNG 是一个免费的互联网元搜索引擎,整合了各种搜索服务的结果。用户不会被跟踪,也不会被分析。 1. 使用 Docker 安装 SearXNG 容器 复制 docker run --rm \-d -p 8080:8080 \-v "${PWD}/searxng:/etc/searxng" \-e "BASE_…

leetcode.nvim使用cookie无法登陆问题

错误描述: 使用力扣 (LeetCode) 全球极客挚爱的技术成长平台 的cookie在neovim上使用leetcode.nvim进行登录会出现curl xxx -D xxxx的报错。 解决方法: 使用LeetCode - The Worlds Leading Online Programming Learning Platform这个网站的cookie进行登…

hisilicon的APP开发

hisilicon的APP开发 hisilicon的APP开发1、在andorid 源码目录对第三方apk进行签名:2、命令启动app应用3、查看SELinux当前状态:4、梯形接口 1、在andorid 源码目录对第三方apk进行签名: 参考:Technology\android\生成系统签名.md java -Xmx2048m -Djava.library.path=&…

Vishay推出具有高辐射强度和短开关时间的新型890 nm红外发光二极管

高速器件采用表面发射器芯片技术,优异的VF温度系数达 -1.0 mV/K 美国 宾夕法尼亚 MALVERN、中国 上海 — 2024年7月24日 — 日前,威世科技Vishay Intertechnology, Inc.(NYSE 股市代号:VSH)宣布,推出一款采…

dorado7 打印校验失败的字段

// Bind #updateTrade.beforeExecute !function(self, arg, dsTrade) { var currentData dsTrade.get("data:#"); if (currentData ! undefined) { var context {}; //校验时传入一个context 打印的时候能把校验出错的字段打印出来 var state currentData.v…

FTP、NFS、SAMBA系统服务

⼀、rsync托管xinetd 1 、为什么要进⾏服务托管 独⽴服务:独⽴启动脚本 ssh ftp nfs dns ... 依赖服务 : 没有独⽴的启动脚本 rsync telnet 依赖 xinetd 服务(独⽴服务) 2 、如何将 rsync 托管给 xinetd 服务去管理? 第⼀步&am…

普发Pfeiffer TPG300手侧配置安装操作技术资疗包含

普发Pfeiffer TPG300手侧配置安装操作技术资疗包含

Spring WebFlux 介绍与效果演示示例

Spring WebFlux 是 Spring Framework 5 引入的一个新的 Web 框架,它专为构建反应式(Reactive)Web 应用程序而设计。以下是对 Spring WebFlux 的详细介绍和示例。 Spring WebFlux 介绍 响应式编程: Spring WebFlux 使用响应式编程的理念,其中数据流和异步操作是核心概念。…

React中的无状态组件:简约之美

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【掌握浏览器版本检测:从代码到用户界面】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论✍ 引言…

JAVA.4.多态

目录 1.表现形式 2.前提条件 1.有继承关系 2.有父类引用指向子类对象 3.有方法的重写 3.注意事项 代码演示 代码结构 1.表现形式 父类类型 对象名字 new 子类对象(); 2.前提条件 1.有继承关系 2.有父类引用指向子类对象 3.有方法的重写 3.注意事项 1.调用成…

ozon要保证金吗,俄罗斯ozon平台要不要保证金

在跨境电商的广阔舞台上,俄罗斯Ozon平台作为本土领先的B2C电商平台,吸引了众多国内外卖家的目光。然而,对于初入该平台的新手卖家而言,一个常见且关键的问题便是:“Ozon要保证金吗?俄罗斯ozon平台要不要保证…

CTF-NSSCTF题单[GKCTF2020]

[GKCTF 2020]CheckIN 这道题目考察:php7-gc-bypass漏洞 打开这道题目,开始以为考察反序列化,但实际并不是,这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval()函数,猜测考察命…

centos系统mysql主从复制(一主一从)

文章目录 mysql80主从复制(一主一从)一、环境二、服务器master1操作1.开启二进制日志2. 创建复制用户3. 服务器 slave1操作4. 在主数据库中添加数据 mysql80主从复制(一主一从) 一、环境 准备两台服务器,都进行以下操…