Socket编程揭秘:端口、IP与进程通信的底层逻辑

socket编程基础

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

进程是人的化身!

人获取数据,通过进程获取!进程获取数据,就是人获取数据!

!!!

上网,只有两种行为!

1、从远端服务器,获取数据

2、本地数据,上传到远端服务器

认识端口号

网络通信本质就是进程间通信,而临界资源就是网络!

通过网络通信,经过解包分用到传输层,即OS会接收到大量的数据!OS需要一个方法将对应数据分发到正确的进程中!这个时候就需要端口号

也就是,传输的报文,到了传输层,内部是携带了对应的端口号,数据要传输给端口号对应的进程!以此确保进程的唯一性!

底层部分实现 --- 原理

在OS底层,根据上图!传输层内部是会有一个hash表,进程PCB设置端口号,就在hash表内做映射,而报文传输到传输层获得有效载荷内,有传输层报头,报头内部存储有效数据的传输端口号!根据端口号到hash查找,映射成功,找到对应进程PCB进行传输,以此保证了进程唯一性!

如何传输?

Linux下一切皆文件!网络或网卡也是文件,那么就会有对应的struct file文件来调用,会有对应的内核缓冲区!

进程通过文件描述符找到对应的struct file结构体,并且找到对应内核缓冲区,以此获取到网络数据!

问题:端口号 Vs pid

1、不是所有的进程都要做网络通信!

2、从技术角度,pid是可行的!但是PID是系统概念!PID变化!网络也要跟着变化!需要端口号是为了解耦!形成低耦合的要求!

而IP + Port 称为socket(插座、套接字)!即socket = IP + Port

通过端口号找进程是唯一的,但是一个进程可能有多个端口号!

知名端口号!与OS动态分配的端口号!普通用户是无法绑定知名端口号,只能在OS动态分配的端口号绑定!

以例子回归概念!

从东土大唐到西天取经,

大唐和西天都是主机

而大唐皇帝和如来佛才是具有特定端口号的进程

而唐僧就是一个报文!内部包含源IP+源Port,目标IP+目标Port

本质是进程间通信!(大唐皇帝和如来佛的通信!)

传输层的典型代表

认识TCP协议

认识UDP协议

TCP协议和UDP协议的都是传输层协议的一种!

对有无连接的理解

有连接:类似于打电话,需要对方接通并对话!

无连接:类似于对讲机那种,即发即产声,不关心是否连接!

可靠传输这个!TCP协议对传输的数据丢包问题,有一定的保护机制,重传!传输速率会调节!

而UDP是不可靠传输,数据丢了不管!类似于撒手掌柜!

为什么要保留UDP协议?UDP不靠谱,为什么OS就保留?

要知道此处的不可靠,不能当成贬义词,要认为是中性词!是这个协议的特点!

记住,没有绝对的优缺点,在不同场景下,是会有影响的!

TCP靠谱,TCP的工作更多,更加复杂!资源占有更多!

而UDP不靠谱,工作少,就简单!

银行交易,网页访问,往往就是使用TCP!

而视频直播的内容分发往往是使用UDP!允许少量丢包!

网络字节序

大端小端的认识

数据又高低权值位!1234,1是10的4次方,4是10的0次方!

低权值位 --> 小权值位

低地址 --> 小地址!

将小权值位的数据写到小地址,就是小端!

数据放入内存的方式,有了大小端的概念!

问题:若主机A是小端存储数据,传输数据到主机B是大端存储,双方存储序列不同,就会造成数据解释错误!

大小端存储的问题,也是没办法,两个都没有问题!只是需要网络出现后的问题!

解决方法:凡是发送到网络中的数据,必须是大端式发送! ,做了一个统一!

为什么是大端?

这个问题没有明确的说明,但是可以认为,是方便阅读!

又设置一系列的转化为大端的方法!h(主机),n(网络),htonl(主机转化为网络的大端字节序!)

socket编程接口

看到上面的API接口,目前先不介绍,到之后编程代码时讲解!

看完上面的接口!可以看到多个接口内部都有一个结构体!接下来我们讲讲!

网络通信本质是进程间通信!

而之前遇到的system V 是用于解决本地进程间通信,posix标准是既解决进程本地通信,还解决网络通信!

这也是为什么system V被淘汰的!

而对于套接字socket!当面对不同的场景,套接字也会有不同的形式!也就是socket会有很多的种类!来满足不同的场景

比如:网络socket、本地socket、原始socket(用不到!)

那么按理说,socket未来的接口需要不同的通信接口规范!

但是socket设计者,只想提供一种通信接口!(低耦合!)

sockaddr结构

在进行网络通信的时候,就设计了sockaddr_in,用户做网络通信!内部存储了socket套接字!Ip地址和端口号!

而做进程间通信,就设计了sockaddr_un,进程间通信也叫unix域间通信,内布存储了一个路径名,这个肯定是共享文件的路径!让两个进程都可以访问到这个文件, 不就是进程间通信!

设计这两个结构,但是设计者并不想直接作为接口传输到函数!接口区别度太大了!希望有统一的接口!到函数之后再判断对于的处理方法!

所以就有了sockaddr结构体!函数传入的都是sockaddr,而进入函数后,根据最开始16位地址类型进行判断!如果是AF_INET就是网络通信!如果是AF_UNIX就是域间通信!以此类推还可以有更多!

而我们做什么通信,都可以正常的定义对应类型的结构体,传参的时候强转为sockaddr!进入函数判断后,再做调整!

这样做通信就可以调用统一的接口!!!

这不就是继承和多态 吗!设计模式就是策略模式

这sockaddr不就是虚基类吗!

为毛不用void呀?
使用这个种以上方式,展现的是一个明显的继承与多态体系!语义表达上更加明显!
更重要的是,设计这套网络接口的时候,C语言还不支持void
!!!

相关推荐
chicheese3 小时前
Linux 面试速查表:从初级到高级,附高频场景答题模板
linux·运维
Linux-lucky4 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
vortex55 小时前
常用终端模拟器全面对比:Kitty、WezTerm、Ghostty 与 Konsole
linux
INGNIGHT6 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
zly35006 小时前
VMware Converter Standalone 物理机转化为虚拟机后源1硬盘变成了2个硬盘(2个硬盘文件)虚拟机无法启动。
linux·运维·服务器
马可家的菠萝6 小时前
你收藏的资料,有多少真的被你第二次打开过?
笔记·知识管理·效率提升·个人知识库
小刘在重生~7 小时前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
职豚求职小程序7 小时前
中国人寿27秋招笔试[特殊字符]北森机考|备考攻略
笔记
江湖人称菠萝包7 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5