当前位置: 首页 > 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.dtcms.com/a/320635.html

相关文章:

  • 力扣-238.除自身以外数组的乘积
  • 《Leetcode》-面试题-hot100-链表
  • 力扣热题100------287.寻找重复数
  • 大语言模型提示工程与应用:提示词基础使用方式
  • 9.2 通过DuEDrawingControl把eDrawing嵌入到C#中显示
  • windows线程基础
  • leetcode热题——有效的括号
  • FPS游戏准心跳动效果实现指南
  • 为什么通过CreateThread创建的线程调用C/C++运行库函数不稳定
  • Sum of Four Values(sorting and searching)
  • 力扣-438.找到字符串中所有字母异位词
  • I/O原理与服务。
  • KTH7111-离轴专用芯片,支持自校准,可替MA600和TLE5012,离轴精度可达±0.2
  • Agent配置最佳实践:Prompt工程与参数调优
  • RAG初步实战:从 PDF 到问答:我的第一个轻量级 RAG 系统(附详细项目代码内容与说明)
  • WWDC 25 玻璃态星际联盟:SwiftUI 视图协同“防御协议”
  • 生产管理ERP系统|物联及生产管理ERP系统|基于SprinBoot+vue的制造装备物联及生产管理ERP系统设计与实现(源码+数据库+文档)
  • 2025华数杯数学建模A题【 多孔膜光反射性能的优化与控制】原创论文分享
  • 暴力解决MySQL连接失败
  • 应用层自定义协议
  • Spring系列之Spring AI入门
  • 关于“致命错误:‘https://github.com/....git/‘ 鉴权失败”
  • 基于Vue.js和Golang构建高效在线客服系统:前端实现与后端交互详解
  • Linux学习-数据结构(哈希表)
  • K8s 常见故障案例分析
  • Axure基于中继器实现的组件库(导航菜单、动态表格)
  • k8s调度问题
  • 实战:在已有K8S集群如何新增和删除Node节点
  • 【网络自动化】利用Python脚本与计划任务,实现H3C/HPE设备配置无人值守备份
  • 冰蝎--安装、使用