赞
踩
主页:醋溜马桶圈-CSDN博客
目录
2.5.3 TCP/IP 协议与操作系统的关系(宏观上,怎么实现的)
计算机之间相互独立
多台计算机连接在一起, 完成数据共享
计算机数量更多了, 通过交换机和路由器连接在一起
将远隔千里的计算机都连在一起
所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网
计算机是人的工具,人要协同工作,注定了网络的产生是必然的
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式
思考: 只要通信的两台主机, 约定好协议就可以了么?
- 定好协议,但是你用频率表示 01,我用强弱表示 01,就好比我用中国话,你用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的
所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司,下面是文心一言生成的标准制定组织,大家看一下就可以
问:能定制协议标准的组织或者公司
答:能定制协议标准的组织或公司主要有以下几类:
1.国际标准化组织 :
- IEEE(电气和电子工程师协会):这是一个由计算机和工程领域专家组成的庞大技术组织,在通信协议领域贡献突出。IEEE 制定了全世界电子、电气和计算机科学领域 30%左右的标准,包括 IEEE 802 系列标准,这些标准涵盖了从局域网(LAN)到广域网(WAN)等多种网络技术
- ISO(国际标准化组织):ISO 是由多个国家的标准化团体组成的国际组织,它在开放系统互连(OSI)模型方面的工作尤为著名。OSI 模型定义了网络通信的七层协议结构,尽管在实际应用中,TCP/IP 协议族更为普遍,但 OSI 模型仍然在学术和理论研究中占有重要地位
- ITU(国际电信联盟):ITU 是联合国下属的专门机构,负责制定电信领域的国际标准。ITU-T 制定的标准涵盖了电话和网络通信,与 ISO 合作确保了通信技术的全球兼容性和互操作性
2.区域标准化组织 :
- ETSI(欧洲电信标准学会):由欧洲共同体各国政府资助,是一个由电信行业的厂商与研究机构参加并从事研究开发到标准制定的组织
- ASTAP(亚洲与泛太平洋电信标准化协会):1998 年由日本与韩国发起成立的标准化组织,旨在加强亚洲与太平洋地区各国信息通信基础设施及其相互连接的标准化工作的协作
3.公司 :
- 某些公司,如泰凌微,也自研各种标准的软件协议栈,包括低功耗蓝牙、zigbee、thread 及 Matter 等,并可进行定制化改动,这是其核心竞争力之一。泰凌微还计划重点发展智能电子价签、智能遥控、智能家居等市场
4.民间国际团体 :
- IETF(互联网工程师任务组):这是一个负责开发和推广互联网协议(特别是构成 TCP/IP 协议族的协议)的志愿组织,通过 RFC 发布新的或者取代老的议标准
5.官方机构 :
- FCC(联邦通信委员会):美国对通信技术的管理的官方机构,主要职责是通过对无线电、电视和有线通信的管理来保护公众利益。也对包括标准化在内的通信产品技术特性进行审查和监督。以上这些组织或公司都能在一定程度上定制协议标准,以满足特定需求或推动技术发展
在这个例子中, 我们的"协议"只有两层:语言层、通信设备层
但是实际的网络通信协议,设计的会更加复杂, 需要分更多的层
但是通过上面的简单例子,我们是能理解,分层可以实现解耦合,让软件维护的成本更低
其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇
TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层
- 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层
物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型
一般而言
所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了
下面,仔细看看下面的图
- 问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?
- 回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?
- 关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型
- 因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。
初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程
而其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包
下面我们明确一下概念
然后,我们在明确一下不同层的完整报文的叫法
最后,在整体复盘一下
在网络传输的过程中,数据不是直接发送给对方主机的,而是先要自定向下将数据交付给下层协议,最后由底层发送,然后由对方主机的底层来进行接受,在自底向上进行向上交付
下图为数据封装的过程
下图为数据分用的过程
从今天开始,我们学习任何协议,都要先宏观上建立这样的认识:
- 要学习的协议,是如何做到解包的?只有明确了解包,封包也就能理解
要学习的协议,是如何做到将自己的有效载荷,交付给上层协议的?
IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
下面是一张示意图
首先理解一下 IP 地址的意义
然后结合封装与解包,体现路由器解包和重新封装的特点
对比 IP 地址和 Mac 地址的区别
提炼 IP 网络的意义和网络通信的宏观流程
IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异
但是这里要思考一个问题:数据传输到主机是目的吗?不是的。因为数据是给人用的。比如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览?
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器
而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据
所以:数据传输到主机不是目的,而是手段。到达主机内部,在交给主机内的进程,才是目的
但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性
端口号(port)是传输层协议的内容
pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?
10086 例子
另外, 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定
进程 ID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这样做
传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号.就是在描述 "数据是谁发的, 要发给谁"
综上
所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp,srcPort,dstIp,dstPort}这样的 4 元组就能标识互联网中唯二的两个进程
所以,网络通信的本质,也是进程间通信
我们把 ip+port 叫做套接字 socket
C++
socket
n.
(电源)插座;(电器上的)插口,插孔,管座;槽;窝;托座;臼;孔穴
vt.
把…装入插座;给…配插座
如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信
此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识; 后面我们再详细讨论 TCP 的一些细节问题
此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换
这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数
例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地址转换后准备发送
- 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);
socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、IPv6,以及后面要讲的 UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同
虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP 地址
in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。