文章目录
- 前言
- 局域网(以太网为例)通信原理
-
- [认识 MAC 地址](#认识 MAC 地址)
- 数据包封装和分用
- 跨网络传输流程介绍
-
- [认识 IP 地址](#认识 IP 地址)
- [IP地址 VS MAC地址](#IP地址 VS MAC地址)
- 跨网络传输流程图
- [Socket 编程预备](#Socket 编程预备)
前言

局域网(以太网为例)通信原理
首先回答,两台主机在同一个局域网,是否能够直接通信?是的
• 原理类似上课
• 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址
认识 MAC 地址
MAC 地址用来识别数据链路层中相连的节点;
• 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
• 在网卡出厂时就确定了, 不能修改.
mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
后面我们详细谈论数据链路层的时候,会谈 mac 帧协议,此处我们做一个了解即可。

在数据链路层就因为dist不一致把报文丢弃了,上层也就看不到了。
以太网中,任何时刻,只允许一台机器向网络中发送数据
• 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
• 所有发送数据的主机要进行碰撞检测和碰撞避免
• 没有交换机的情况下,一个以太网就是一个碰撞域
• 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标
mac 地址判定
• 这里可以试着从系统角度来理解局域网通信原理
初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程
以太网总结:
1、基于碰撞检测和碰撞避免的通信方式。
2、目前应用最广泛的通信协议之一。
3、位于数据链路层。
4、所以以太网本质是一种临界资源,所有主机访问以太网都相当于是以临界区式的访问。

1、而其中每层都有协议(协议本质是结构体),所以当我进行进行上述传输流程的时候,要进行封装和解包:对传输信息(有效载荷)用报头进行封装,报头类比快递盒,传输信息(有效载荷)类比快递物品。
2、报头本质就是协议结构体对象。
3、自顶向下叫做协议封装,或添加报头。
3、自下往上叫做解包。
4、报文 = 报头 + 有效载荷。
5、数据链路层的报文整体叫做数据帧,网络层的报文整体叫做数据报,传输层的报文整体叫做数据段,应用层的报文整体叫做请求与应答。
6、网络传输是逻辑上同层认为自己是直接通信,因为同层之间结构体是同类型的,物理上是自顶向下封装,然后通过网卡传输,最后自下往上解包。


• 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
• 除了报头,剩下的叫做有效载荷
• 故,报文 = 报头 + 有效载荷
然后,我们在明确一下不同层的完整报文的叫法
• 不同的协议层对数据包(报文)有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
• 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
• 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
• 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理。
数据包封装和分用
任意层协议(应用层除外)都要解决两个问题:
1、解包,即分离报头和有效载荷。
2、分用,即把数据解包交付给上层哪一种协议。


局域网通信本质是协议栈之间通信,而不是主机之间通信。(类比打电话,以网络层为例,在主机通信时,网络层协议栈认为和对端主机的网络层协议栈直接通信)
跨网络传输流程介绍
认识 IP 地址
IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的, 默认都是指 IPv4
• IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;
• 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
• 我们通常也使用 "点分十进制" 的字符串表示 IP 地址(可读性更好), 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
IP地址 VS MAC地址
IP地址可以理解为长远目的地,MAC地址是短期的目的地,所以我们可以根据目的IP,动态选择出我要经历的MAC地址(就是选择出要经历哪些主机或路由器)
跨网络传输流程图


1、这里我们就可以理解源MAC地址和目的MAC地址为什么会一直变化了,是因为在进行传输过程中,每经历一个路由器就会发生一次封装、解包的过程。
2、mac地址只在同一个局域网中有效。
3、在网络层,大家看到的数据报都是相同的,如下图所示,所以在网络层之上都是看到的同一个数据报,而在网络层之下我们看到的数据帧是不同的,例如以太网、令牌环网... 所以ip协议虚拟化(封装)了底层局域网的差异!!

Socket 编程预备
理解源 IP 地址和目的 IP 地址
• IP 在网络中,用来标识主机的唯一性
• 注意:后面我们会讲 IP 的分类,后面会详细阐述 IP 的特点
但是这里要思考一个问题:数据传输到主机是目的吗?不是的。因为数据是给人用的。比如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览?
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。
而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。
所以:数据传输到主机不是目的,而是手段。到达主机内部,在交给主机内的进程,才是目的。(网络通信的本质就是进程间通信)
但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识进程的唯一性,也就是下面介绍的端口号。

认识端口号
1、端口号(port)是传输层协议的内容.
• 端口号是一个 2 字节 16 位的整数;
• 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
• IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
• 一个端口号只能被一个进程占用,但是一个进程可以绑定多个端口号。
尽管已经有了pid来唯一标记进程,我们还要引入端口号,是为了解耦合。

2、端口号范围划分
• 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的. (类比120、110)
• 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.
3、理解 socket
• 综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程
• IP+Port 就能表示互联网中唯一的一个进程
• 所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp(源ip),srcPort(源端口),dstIp(目的ip),dstPort(目的端口)}这样的 4 元组就能标识互联网中唯二的两个进程。
• 所以,网络通信的本质,也是进程间通信
• 我们把 ip+port 叫做套接字 socket
套接字本质就是进程的一个文件绑定了ip和端口号!
传输层的典型代表
如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。

认识 TCP 协议
此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;
后面我们再详细讨论 TCP 的一些细节问题.
• 传输层协议
• 有连接(类比打电话的"喂")
• 可靠传输(对发出的数据有售后服务)
• 面向字节流
认识 UDP 协议
此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论.
• 传输层协议
• 无连接(类比发邮件或消息,不用先打招呼)
• 不可靠传输(对发出的数据没有售后服务)
• 面向数据报
网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分(快速记忆:小小小:数据低权值放在低地址处,为小端,非小端即大端(数据高权值放在低地址处),权值:123,1是高权值,3的低权值), 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
• 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
• 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
• 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
• TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
• 不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;
• 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;
socket 常见 API

以上就是小编分享的全部内容了,如果觉得不错还请留下免费的赞和收藏
如果有建议欢迎通过评论区或私信留言,感谢您的大力支持。
一键三连好运连连哦~~
