当前位置: 首页 > news >正文

Linux网络--2、Socket编程

目录

一、前言

二、认识IP 

        2.1理解源IP和目的IP

三、认识端口号

        3.1结构与划分

        3.2port与pid的理解

        3.3理解socket

四、传输层典型协议

        4.1TCP

        4.2UDP

        4.3网络字节序

五、Socket编程接口


一、前言

        前文我们了解了网络通信的基本过程和原理,那我们该如何操作实现网络通信?

二、认识IP 

        2.1理解源IP和目的IP

IP在网络中,用来标识主机的唯一性,通过IP找到主机

        我们在网络通信过程中我们要知道数据传输到主机并不是主要目的,数据是给人用的,人如何看到并使用这些数据?通过启动进程(一系列app),换句话说,进程是⼈在系统中的代表,只要把数据给进程,⼈就相当于就拿到了数据。

        数据传输到主机不是⽬的,⽽是⼿段。到达主机内部,在交给主机内的进程,才是⽬的。但是系统中,同时会存在⾮常多的进程,当数据到达⽬标主机之后,怎么转发给⽬标进程?这就要在⽹络的背景下,在系统中,标识主机的唯⼀性。

三、认识端口号

在上段中我们找到了主机,但如何找到特定进程?这就要引出我们的端口号了!

        3.1结构与划分

端⼝号( port )是传输层协议的内容.
        端⼝号是⼀个 2 字节 16 位的整数;
        端⼝号⽤来标识⼀个进程, 告诉操作系统, 当前的这个数据要交给哪⼀个进程来处理;
        IP地址 + 端⼝号能够标识⽹络上的某⼀台主机的某⼀个进程;
        ⼀个端⼝号只能被⼀个进程占⽤.
端⼝号范围划分
        0 - 1023 : 知名端⼝号, HTTP, FTP, SSH 等这些⼴为使⽤的应⽤层协议, 他们的端⼝号都
是固定的.
        1024 - 65535 : 操作系统动态分配的端⼝号. 客⼾端程序的端⼝号, 就是由操作系统从这个范围分配的.
        传输层协议( TCP UDP )的数据段中有两个端⼝号, 分别叫做源端⼝号和⽬的端⼝号. 就是在描述 "数据是谁发的, 要发给谁";

        3.2port与pid的理解

之前在学习系统编程的时候, 学习了 pid 表⽰唯⼀⼀个进程; 此处我们的端⼝号也是唯⼀表⽰⼀个进程. 那么这两者之间是怎样的关系?
        ⼀个进程可以绑定多个端⼝号; 但是⼀个端⼝号不能被多个进程绑定;
        进程 PID 属于系统概念,技术上也具有唯⼀性,确实可以⽤来标识唯⼀的⼀个进程,但是这样做,会让系统进程管理和⽹络强耦合,实际设计的时候,并没有选择这样做。

        3.3理解socket

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

四、传输层典型协议

        传输层是属于内核的,那么我们要通过⽹络协议栈进⾏通信,必定调⽤的是传输层提供的系统调⽤,来进⾏的⽹络通信

        4.1TCP

        4.2UDP

        4.3网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有⼤端和⼩端之分, 磁盘⽂件中的多字节数据相对于⽂件中的偏移地址也有⼤端⼩端之分, ⽹络数据流同样有⼤端⼩端之分. 那么如何定义⽹络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到⾼的顺序发出;
接收主机把从⽹络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到⾼的顺序保存;因此,⽹络数据流的地址应这样规定: 先发出的数据是低地址,后发出的数据是⾼地址.
TCP/IP协议规定,⽹络数据流应采⽤⼤端字节序,即低地址⾼字节.
不管这台主机是⼤端机还是⼩端机, 都会按照这个TCP/IP规定的⽹络字节序来发送/接收数据;
如果当前发送主机是⼩端, 就需要先将数据转成⼤端; 否则就忽略, 直接发送即可;
所有发送到⽹络上的数据,都必须是⼤端的!

五、Socket编程接口

        简单API接口

// 创建 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);socket API是⼀层抽象的⽹络编程接⼝,适⽤于各种底层⽹络协议,如IPv4、IPv6,以及后⾯要讲的UNIX
Domain Socket. 然⽽, 各种⽹络协议的地址格式并不相同.

理解sockaddr

http://www.lryc.cn/news/614111.html

相关文章:

  • 中国电信清华:大模型驱动的具身智能发展与挑战综述
  • 动漫软件集合分享
  • Pytest项目_day08(setup、teardown前置后置操作)
  • 144.二叉树的前序遍历
  • 鲸签云解决互联网行业合同管理难题​
  • 【Rust】多级目录模块化集成测试——以Cucumber为例
  • 线程组和线程池的基本用法
  • 【Spring Boot 快速入门】八、登录认证
  • duxapp 2025-05-29 更新 兼容鸿蒙C-API方案,现在鸿蒙端可以用于生产
  • React SSR 水合问题
  • 《告别Bug!GDB/CGDB调试实战指南》
  • TF 上架全流程实战,从构建到 TestFlight 分发
  • UniApp 跳转外部链接实现
  • Elasticsearch LTR(Learning To Rank)从训练到检索与重排
  • Elasticsearch:在向量搜索中使用 Direct IO
  • 力扣-438.找到字符串中所有字母异位词
  • ctfshow_萌新web9-web13-----rce
  • python学智能算法(三十五)|SVM-软边界拉格朗日方程乘子非负性理解
  • LeetCode 刷题【34. 在排序数组中查找元素的第一个和最后一个位置、35. 搜索插入位置】
  • 文件管理从基础到高级:文件描述符、超大文件切片重组与快速删除实战
  • 五、CV_ResNet
  • 腾讯iOA:数据安全的港湾
  • wordpress的wp-config.php文件的详解
  • proteus实现简易DS18B20温度计(stm32)
  • Linux软硬链接与动静态库
  • SQL的多表连接查询(难点)
  • 冷冻食材,鲜美生活的新选择
  • trae开发c#
  • 面试题:bable,plugin,loader,还有在打包过程中.vue/.react文件是如何转化为.js文件的
  • 解决Ollama外部服务器无法访问:配置 `OLLAMA_HOST=0.0.0.0` 指南