目录
[3.3TCP/IP协议与操作系统的关系(宏观上,怎么实现的)](#3.3TCP/IP协议与操作系统的关系(宏观上,怎么实现的))
[5.3.1认识TCP协议 TCP(Transmission Control Protocol 传输控制协议)](#5.3.1认识TCP协议 TCP(Transmission Control Protocol 传输控制协议))
[5.3.2认识UDP协议 UDP (User Datagram Protocol 用户数据报协议)](#5.3.2认识UDP协议 UDP (User Datagram Protocol 用户数据报协议))
1.背景
网络发展
独立模式:计算机之间相互独立;
网络互联:多台计算机连接在一起,完成数据共享;
局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起;
广域网WAN:将远隔千里的计算机都连在一起;
所谓"局域网"和"广域网"只是一个相对的概念.比如,我们有"东方古国特色"的广域网,也可以看做一个比较大的局域网。
计算机是人的工具,人要协同工作,注定了网络的产生是必然的。
2.协议简述
协议是一种约定
打电话约定电话铃响的次数的约定
计算机之间的传输媒介是光信号和电信号 .通过"频率"和"强弱"来表示0和1这样的信息.要想传递各种不同的信息,就需要约定好双方的数据格式.
只要通信的两台主机,约定好协议就可以了么?定好协议,但是你用频率表示01,我用强弱表示01,就好比我用中国话,你用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的
所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守 。计算机生产厂商有很多;
计算机操作系统,也有很多;
计算机网络硬件设备,还是有很多;
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?就需要有人站出来,约定一个共同的标准,大家都来遵守,这就是网络协议;
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司。
下面是AI显示的内容,仅供参考:
能定制协议标准的组织/公司,大致分为三类:国际/国家/行业标准组织、团体标准组织、企业及专业服务机构。
一、国际/国家/行业标准组织(制定通用协议标准)
这类组织制定的是国际、国家或行业层面通用的协议标准,企业可以参与起草,但不能"单独定制":
国际标准化组织(ISO):制定质量管理、环境管理、信息安全等通用标准,如 ISO 9001、ISO 14001、ISO/IEC 27001 等。
国际电工委员会(IEC):负责电气、电子技术领域的国际标准,如信息技术设备安全标准 IEC 60950。
国际电信联盟(ITU):制定电信和信息通信技术标准,如 ADSL 标准 ITU-T G.992.1、视频压缩标准 H.264。
互联网工程任务组(IETF):专门制定互联网协议标准,如 HTTP/1.1、TCP/IP。
万维网联盟(W3C):制定 Web 技术标准,如 HTML5、CSS3。
国家/行业标准机构:如中国国家标准、行业标准,由国务院有关行政主管部门或标准化技术委员会制定,企业可参与起草。
二、团体标准组织(行业/联盟定制标准)
团体标准由学会、协会、商会、联合会、产业技术联盟等社会团体自主制定,供成员自愿采用,是典型的"行业定制标准"形式:
例如:中国消费品质量安全促进会发布的《团体定制服装分级技术要求》团体标准,由京东政企业务联合多家品牌发起,针对团体定制服装行业制定分级、质量和服务要求。
企业可以发起或参与团体标准制定,将自身技术、服务规范转化为行业标准,提升竞争力和话语权。
三、企业及专业服务机构(定制企业标准/团体标准)
企业可以自主制定企业标准,也可以委托专业机构协助制定团体标准或企业标准:
企业自主制定企业标准
企业可以针对自身产品、服务或管理流程制定企业标准,并在"全国企业标准信息公共服务平台"自我声明公开,作为产品上市、招投标、验收的依据。
企业标准可以严于国家标准或行业标准,体现技术优势和管理水平。
专业标准化服务机构
如北京标准化科技有限公司、湖南筑励咨询有限公司等,提供团体标准制定、参编、编写、咨询等全流程服务,帮助企业完成标准立项、起草、评审和发布。
鼎衡标准化服务(嘉兴)有限公司等机构,则专门为企业提供企业标准制定、备案、培训等一站式服务,帮助企业规避合规风险。
以上这些组织或公司都能在一定程度上定制协议标准,以满足特定需求或推动技术发展。
2.1协议分层
协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的.
软件分层的好处
在这个例子中,我们的"协议"只有两层:语言层、通信设备层,但是实际的网络通信协议,设计的会更加复杂,需要分更多的层,但是通过上面的简单例子,我们是能理解,分层可以实现解耦合,各个模块都可以随时替换,以满足不同需求且让软件维护的成本更低(解决问题只需修改某个层,而不至于整个软件都要替换)。
许多问题都可以通过添加一层软件层来解决。
2.2OSI七层模型
OSI(OpenSystemInterconnection,开放系统互连) 七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
把网络从逻辑上 分为了7层。 每一层都有相关、相对应的物理设备,比如路由器,交换机;
OSI七层模型是一种框架性 的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输。(注意,标准的提出者并不意味着一定要全部由提出者实现,可以由其他人实现,因此OSI这个组织提出的osi模型本身不是由osi实现的)
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
但是,它既复杂又不实用;所以我们按照TCP/IP四层模型来说明。
其实在网络角度,OSI定的协议7层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5层协议。
2.3TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求物理层 :负责光/电信号的传递方式.比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等.集线器(Hub)工作在物理层(集线器最重要的功能就是将因为长距离传输而衰减的信号重新放大 )
数据链路层:负责设备之间的数据帧的传送和识别.例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作.有以太网、令牌环网,无线LAN等标准.交换机(Switch)工作在数据链路层.注意,早期世界各地都在研发网络,研发出了各不相同、可以通信的局域网 ,而最后当大家一起将各自的局域网进行互联的时候,逐渐淘汰了不实用的局域网,最后就留下了上面所说的以太网、无限LAN等。但要注意,互联网也就是公网本身只有一套 ,是世界各地通用的。
网络层 :负责地址管理和路由选择.例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由).路由器(Router)工作在网路层
传输层 :负责两台主机之间的数据传输.如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机.
应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等.我们的网络编程主要就是针对应用层.
物理层我们考虑的比较少,我们只考虑软件相关的内容.因此很多时候我们直接称为TCP/IP四层模型
一般而言对于一台主机,它的操作系统内核实现了从传输层到物理层的内容;
对于一台路由器,它实现了从网络层到物理层;
对于一台交换机,它实现了从数据链路层到物理层;
对于集线器,它只实现了物理层;
但是并不绝对.很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发);
3.深入协议
3.1为什么要有TCP/IP协议?
首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。
其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。
所以,为什么要有TCP/IP协议?本质就是通信主机距离变远了
3.2什么是TCP/IP协议?
TCP/IP协议的本质是一种解决方案(方案必然有好有坏,衡量的标准就是可扩展和方便维护,因此网络协议是层状的结构)
TCP/IP协议能分层,前提是因为问题们本身能分层
3.3TCP/IP协议与操作系统的关系(宏观上,怎么实现的)
注意,里面的用户层并不是真的分了用户层,图中的用户层和系统调用接口都是应用层的范畴。
3.4所以究竟什么是协议?
截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。
OS源代码一般都是用C/C++语言写的。
问题:主机B能识别protool类型的data对象,并且准确提取数据吗?
回答:答案是肯定的!因为双方都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有"共识",能够识别对方发来的数
据,这不就是约定吗?
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型
因为协议栈是分层的,所以,双方每层都有协议,同层之间,互相可以认识对方的协议。
4.网络传输基本流程
4.1局域网网络传输流程图
4.1.1局域网(以太网为例)通信原理
首先回答,两台主机在同一个局域网,是否能够直接通信 ?
原理类似上课(当你喊了某个人的时候,大家都会听到,但是只有那个人会给你反应,其他人都没有反应,因为不是叫他们),因此肯定可以直接通信。
每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac地址
4.1.2认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48 比特位,即6 个字节。一般用16 进制数字加上冒号的形式来表示
(例如:08:00:27:03:fb:19)
在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址).
不管死手机、电脑还是什么,只要联网,都需要网卡,有网卡就有mac地址。
windows>ipconfig /all
linux>ifconfig
注意,这里面的ether(以太),说明我这台云服务器连的局域网是以太网。
关于mac帧协议,我后面还会发相关文章,这里先了解。
以太网中,任何时刻,只允许一台机器向网络中发送数据如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
所有发送数据的主机要进行碰撞检测和碰撞避免(主机休眠,过段时间再发)
没有交换机的情况下,一个以太网就是一个碰撞域
可以理解为,局域网是个临界资源,需要互斥的访问。
而互斥的方式,不是加锁,而是通过碰撞检测和避免来实现,不做准备,直接发,出现碰撞了就等,等一段时间再发,循坏,直到检测到没有碰撞,就是发成功,发成功的时刻,说明局域网此时只有一台机器发送数据。
而与以太网不同的是,令牌环网,最主要的区别在于,用令牌,实现了互斥锁的效果,只有持有令牌的主机才能发送数据,发完令牌给别的主机。
但因为局域网都是光电信号,速度快,主机间大概率都是错开发送,所以粗暴点的以太网,反而效果也不错。
题外话,想要黑掉一个局域网,最简单最有效的方法,就是不停在局域网中发送垃圾数据,这样其他主机都因为检测到碰撞,无法接受或发送数据,自然局域网就瘫痪了。
另外,局域网的主机是越少越好,因为主机增多,以太网的机制下,整个网络有主机发送数据的概率就会增加,主机越多,概率越大,发送数据的主机越多,碰撞的概率就越大,自然通信的效率就会降低。
碰撞概率增加,意味着需要重发数据,这样的话单位时间内发送的数据量就降低了,体现在生活中,就是下游戏的时候发现,下载速度从50MB/s下降到10MB/s,甚至更低。
相信大家都参加过校园的运动会,尤其是允许带手机的高中,或者一般的大学。无线LAN的原理跟以太网有点像,只是发送数据的形式从网线变成了无线电波,由基站来处理这些电波。因此当所有学生都在操场上聚集,会发现网络非常非常的差,因为基站处理不过来,再加上碰撞的概率大大增加,自然我们会明显感觉到网络变差。
除了运动会,平时在校园,其实整个校园也是个局域网也就是我们常说的校园网,而如果照上面的理论,网速肯定会差,为了减少碰撞,因此就需要交换机,具体的后面再说。
局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定
而其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包
最后再讲一个题外话,从令牌环网,无线LAN,我们都可以顾名思义,但是以太网是啥情况?以太这个词来自于物理学的一个已被证伪的假说中,在这个假说中,以太是在真空的物质,但实际上物理学家发现并不存在。而计算机网络发明的时候,实际上科学家都是多领域的,因此当以太网理论发明出来后,就被了解这个假说的人提议,将这个有一定相似的网络命名为以太网。
报头部分,就是对应协议层的结构体对象或字段,我们一般叫做报头
除了报头,剩下的叫做有效载荷
故,报文=报头+有效载荷
然后,我们在明确一下不同层的完整报文的叫法:
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报
(datagram),在链路层叫做帧(frame),在应用层是request/response
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装
(Encapsulation).
首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理
总结一下:在网络传输的过程中,数据不是直接发送给对方主机的,而是先要自顶向下将数据交付给下层协议,最后由底层发送,然后由对方主机的底层来进行接受,在自底向上进行向上交付。
因为数据必须通过物理层传输,也就意味着两个主机的物理层是必须经过的,而要从应用层到物理层,必然要经过整个协议栈,同样,物理层到应用层也是如此。
4.1.3数据包封装和分用
下图为封装过程。
下面是数据解包与分用的过程,解包就是每层协议都将报头和有效载荷分离,分用,就是把有效载荷交付给上层对应的协议。
基于封装和解包分用,也就出现了 逻辑上:同层协议,都可以认为自己在和对方直接通信。比较形象的说,我们平时打电话,我们可能认为我们在直接跟对方说话,但其实我们双方都是通过手机,基站来通信的,只是我们忽略了这些。而网络协议这的逻辑通信也是同理,每层都忽略了下层的细节,只认为自己在跟对方直接通信。
我们要有宏观上的认识:要学习的协议,是如何做到解包的?只有明确了解包,封包也就能理解
要学习的协议,是如何做到将自己的有效载荷,交付给上层协议的?
4.2跨网络传输流程图
4.2.1网络中的地址管理-认识IP地址
IP 协议有两个版本,IPV4 和 IPv6。后面凡是提到IP协议,没有特殊说明的,默认都是指 IPv4
IP 地址是在 IP 协议中;用来标识网络中不同主机的地址;
对于 IPv4 来说,IP 地址是一个 4 字节,32 位的整数;
我们通常也使用"点分十进制"的字符串表示 IP 地址,例如192.168.0.1;用点分割的每一个数字表示一个字节,范围是0-255
跨网段的主机的数据传输.数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
首先理解一下IP地址的意义为什么要去目标主机,先要走路由器?
目的IP的意义
ip有源ip和目的ip。源ip和目的ip是在ip协议的报头里,源mac和目的mac是在数据链路层的协议报头里。
对比IP地址和Mac地址的区别
IP地址在整个路由过程中,一直不变(暂时这样说明,我后面再改)
Mac地址一直在变
目的IP是一种长远目标,Mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据
IP网络层存在的意义:提供网络虚拟层,让世界的所有网络都是IP网络,屏蔽最底层网络的差异
5.Socket编程预备
5.1理解源IP地址和目的IP地址
IP 在网络中,用来标识主机的唯一性
注意:ip的分类和特点后面再说
但是这里要思考一个问题 :数据传输到主机是目的吗?不是的。因为数据是给人用的。比如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览。
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。
而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。
所以:数据传输到主机不是目的,而是手段。到达主机内部,在交给主机内的进程,才是目的。
但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性。
5.2认识端口号
端口号( port )是传输层协议的内容.
端口号是一个 2字节16 位的整数;
端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
IP地址+端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用。
5.2.1端口划分
0-1023:知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的.
1024-65535:操作系统动态分配的端口号.客户端程序的端口号,就是由操作系统从这个范围分配的.
5.2.2理解"端口号"和"进程ID"
我们之前在学习系统编程的时候,学习了pid表示唯一一个进程;此处我们的端口号也是唯一表示一个进程.那么这两者之间是怎样的关系?
另外,一个进程可以绑定多个端口号;但是一个端口号不能被多个进程绑定;
进程PID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这样做。
再粗糙的理解下,os中会用某种数据结构(比如hash表、链表、甚至数组)维护端口号表,结构中每个元素的(下标、哈希值)就是端口号,元素值就是跟这个端口号绑定的进程的pcb,所以只要有了端口号,就可以找到对应的进程pcb,就可以把数据给对应的进程。
5.2.3理解源端口号和目的端口号
传输层协议(TCP和UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号.就是在描述"数据是谁发的,要发给谁";
5.2.4理解socket
综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程
IP+Port 就能表示互联网中唯一的一个进程
所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srclp,srcPort,dstlp,dstPort}这样的4元组就能标识互联网中唯二的两个进程
所以,网络通信的本质,就是进程间通信(我们说过进程间通信需要的是进程间先看到同一个公共资源,而这里,网络就是可以看到的同一个公共资源)
我们把 ip+port 叫做套接字 socket(中文意思就有电源插座,槽什么的),因此这种通信方式也叫做socket通信。
5.3传输层的典型代表
如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。
5.3.1认识TCP协议 TCP(Transmission Control Protocol 传输控制协议)
仅认识
传输层协议
有连接
可靠传输
面向字节流
5.3.2认识UDP协议 UDP (User Datagram Protocol 用户数据报协议)
仅认识
传输层协议
无连接
不可靠传输
面向数据报
可靠就是如果出现数据错乱或者丢失,tcp会重新排序、传输,而udp是不管。我们应当认为这是2种协议的特性,而不是优缺点。
tcp可靠传输,意味着做了更多的事情来保证传输的可靠性,接口和理论也就更加的复杂。udp不可靠,但相应的不管是理论还是接口都相对的简单。
tcp的应用领域,比如支付、网页浏览等。udp的话,比如视频流推送和直播。
5.4网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分.那么如何定义网络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节,
不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可;
大端模式 :数据的高位字节(像文章的标题)存放在低地址。这符合人类的阅读习惯,你从开始位置读到的就是最重要的部分。
小端模式 :数据的低位字节(像文章正文的最后一个字)存放在低地址。这更符合计算机的处理逻辑,因为计算常从低位开始。
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
cpp#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);这些函数名很好记,h 表示 host,n 表示 network,l表示 32 位长整数,s 表示 16 位短整
数。
例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
所有发送到网络上的数据,都必须是大端的!
5.5socket编程接口
socket编程是有不同种类的,有的是专门用来进行本地通信的(Unix socket),有的是用来专门进行跨网络通信(inet socket),还有的是用来进行网络管理的(raw socket)。
但是为了方便使用,以免每种socket都有一套接口,选择将接口统一;而linux是c语言写的,这就意味着,没有继承多态的特性,所以要想统一接口,就得先统一类型(比如本地通信可能用的是文件路径,网络通信是ip+port),统一成sockaddr结构。
5.5.1socket常见API
cpp//创建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);
5.5.2sockaddr结构
socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket.然而,各种网络协议的地址格式并不相同.
IPv4和lPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址,图中另一个是sockaddr_un(本地通信用的)。
IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6。这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。因此这些接口内部会判断究竟是什么通信,这样就通过c语言实现了多态,接口统一。(注意,因为当初设计socket的时候c语言不支持void*,所以这里是用struct sockaddr)
socket APl可以都用struct sockaddr*类型表示,在使用的时候需要强制转化成sockaddr_in;这样的好处是程序的通用性,可以接收IPv4,IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;
下面为AI生成
cpp/* 1. sockaddr 结构 - 通用套接字地址结构 */ struct sockaddr { __SOCKADDR_COMMON(sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ }; /* sockaddr 结构说明: 虽然socket API的接口是sockaddr,但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in;这个结构里主要有三部分信息: 地址类型,端口号,IP地址。 */ /* 2. sockaddr_in 结构 - IPv4互联网套接字地址结构 */ /* Structure describing an Internet socket address. */ struct sockaddr_in { __SOCKADDR_COMMON(sin_); /* Common data: address family and length. */ in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of 'struct sockaddr'. */ unsigned char sin_zero[sizeof(struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)]; }; /* 3. in_addr 结构 - IPv4地址结构 */ struct in_addr { in_addr_t s_addr; /* IPv4地址,本质上是一个32位整数 */ }; /* in_addr 结构说明: in_addr 用来表示一个IPv4的IP地址。其实就是一个32位的整数; */虽然socket api的接口是sockaddr,但是我们真正在基于iPv4编程时,使用的数据结构是sockaddr_in;这个结构里主要有三部分信息:地址类型,端口号,IP地址,
in_addr用来表示一个IPv4的IP地址.其实就是一个32位的整数;




























