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.xdnf.cn/news/1487767.html

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

相关文章

边缘计算网关项目(含上报进程、32Modbus采集进程、设备搜索响应进程源码)

目录 边缘层 架构说明 包含知识点 数据上报进程 功能描述 功能开发 上报线程 数据存储线程 指令处理线程 项目源码 上报模块.c代码: 上报模块Makefile代码: STM32采集模块.c代码 设备搜索响应模块Linux部分.c代码 设备搜索响应模块Qt端代码.h …

流量录制与回放:jvm-sandbox-repeater工具详解

在软件开发和测试过程中,流量录制与回放是一个非常重要的环节,它可以帮助开发者验证系统在特定条件下的行为是否符合预期。本文将详细介绍一款强大的流量录制回放工具——jvm-sandbox-repeater,以及如何利用它来提高软件测试的效率和质量。 …

《Cross-Modal Dynamic Transfer Learning for Multimodal Emotion Recognition》

Multi-modal系列论文研读目录 文章目录 Multi-modal系列论文研读目录1.ABSTRACT2.INDEX TERMS3.INTRODUCTION4.RELATED WORKSA. MULTIMODAL EMOTION RECOGNITION 多模态情感识别1) CONVENTIONAL FUSION METHODS 常规融合方法2) TRANSFORMER-BASED FUSION METHODS 基于变压器的融…

C#测试控制台程序调用Quartz.NET的基本用法

Quartz.Net是常用的任务调用框架之一,既能在客户端程序中使用,也支持在网页程序后台调用。本文结合参考文献4中的示例代码学习其在控制台程序中的基本用法。   VS2022新建控制台项目,在Nuget包管理器中搜索并安装Quartz包,如下所…

IDEA在编译的时候报Error: java: 找不到符号符号: 变量 log lombok失效问题

错误描述 idea因为lombok的报错: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy8Lombok supports: sun/apple javac 1.6, ECJ 原因:这是由于Lombok的版本过低的…

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 ,图片合并及保存需要另做处理!! 目标:Excel合并行内容的导入 结果: 1. ExcelUtil.java 类,新增方法:判断是否是合并行 /*** 新增 合并行相关代码:…

matlab 绘制参数方程

matlab 绘制参数方程 绘制参数方程绘制结果 绘制参数方程 clc; clear; close all;axis_length 100;% 定义参数t的范围 t 0:0.01:100;% 计算x和y的值 x t.^2 1; y 4*t - t.^2;% 绘制函数图像 plot(x, y); xlabel(x); ylabel(y); title(Plot of the curve xt^21, y4t-t^2…

Uprecise软件的基本功能

UPrecise 是和芯星通独立开发的评估软件, 旨在帮助用户便捷地对公司产品进行可视化操作。 用户可通过该软件以串口或端口的方式与接收机进行交互并直观地查看其状态信息,连接后 UPrecise 将自动识别接收机的波特率和类型,动态显示该类型接收机…

Python3网络爬虫开发实战(2)爬虫基础库

文章目录 一、urllib1. urlparse 实现 URL 的识别和分段2. urlunparse 用于构造 URL3. urljoin 用于两个链接的拼接4. urlencode 将 params 字典序列化为 params 字符串5. parse_qs 和 parse_qsl 用于将 params 字符串反序列化为 params 字典或列表6. quote 和 unquote 对 URL的…

FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章分享FastAPI(七十二)实战开发《在线课程学习系统》接口开发-- 留言列表开发,这次我们分享如何回复留言 按…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑,修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

Linux:传输层(1) -- UDP协议

1. 端口号 同一台主机的不同端口号(Port)标记了主机上不同的进程,如下图所示: 在 TCP/IP 协议中 , 用 " 源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信 ( 可…

QT开发(QT的基本概述和环境的安装)

QT的概述 一.QT的介绍背景1.1 什么是QT1.2QT的发展史1.3 Qt支持的平台1.4QT版本1.5QT的优点1.6QT的应用场景 二.搭建QT开发环境2.1 QT的开发工具的下载2.2 QT环境变量配置 三.QT的三种基类四.QT Hello World程序4.1使用按钮实现4.1.1 代码方式实现4.1.2 可视化操作实现 一.QT的…

GO内存分配详解

文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …

2024.7.24 作业

1.二叉树的创建、遍历自己实现一遍 bitree.h #ifndef BITREE_H #define BITREE_H#include <myhead.h>typedef char datatype;typedef struct Node {datatype data;struct Node *left_child;struct Node *right_child; }Node,*BiTreePtr;//创建二叉树 BiTreePtr tree_cr…

MinerU、Magic-PDF、Magic-Doc

文章目录 一、关于 MinerU二、Magic-PDF1、简介2、项目全景3、流程图4、子模块仓库 三、Magic-PDF 上手指南1、配置要求2、安装配置1. 安装Magic-PDF2. 下载模型权重文件3. 拷贝配置文件并进行配置4. 使用CUDA或MPS加速推理CUDAMPS 3、使用说明1) 通过命令行使用直接使用更多用…

带您详细了解安全漏洞的产生和防护

什么是漏洞&#xff1f; 漏洞是 IT、网络、云、Web 或移动应用程序系统中的弱点或缺陷&#xff0c;可能使其容易受到成功的外部攻击。攻击者经常试图寻找网络安全中的各种类型的漏洞来组合和利用系统。 一些最常见的漏洞&#xff1a; 1.SQL注入 注入诸如 SQL 查询之类的小代…

机器学习周报第四周(7.15-7.21)

文章目录 摘要Abstract1.批次&#xff08;Batch&#xff09;和动量&#xff08;momentum&#xff09;1.1 批次&#xff08;Batch&#xff09;1.2 Momentum 2.自动调整学习速率&#xff08;Learning rate&#xff09;2.1 Adagrad 算法2.2 RMSProp2.3 Adam2.4 学习率调度 3.朴素贝…

美摄科技企业级视频拍摄与编辑SDK解决方案

在数字化浪潮汹涌的今天&#xff0c;视频已成为企业传递信息、塑造品牌、连接用户不可或缺的强大媒介。为了帮助企业轻松驾驭这一视觉盛宴的制作过程&#xff0c;美摄科技凭借其在影视级非编技术领域的深厚积累&#xff0c;推出了面向企业的专业视频拍摄与编辑SDK解决方案&…