网络基础(协议,地址,OSI模型、Socket编程......)

目录

一、计算机网络发展

二、协议

1.认识协议

2.OSI七层模型

[3.TCP/IP 五层(或四层)模型](#3.TCP/IP 五层(或四层)模型)

4.协议本质

三、网络传输流程

1.MAC地址

2.协议栈

3.IP地址

[IP地址 vs MAC地址](#IP地址 vs MAC地址)

[1. 核心区别](#1. 核心区别)

[2. 具体通信过程类比](#2. 具体通信过程类比)

[3. 关键总结](#3. 关键总结)

为什么需要两者?

4.协议栈图解

Socket编程

1.端口号

2.TCP/UDP协议

3.网络字节序

[4.sockaddr 结构](#4.sockaddr 结构)


一、计算机网络发展

计算机作为人类协作的重要工具,其互联需求天然 催生了网络技术的发展。最初,局部范围内的连接需求推动了局域网(LAN)的诞生,这些网络如同散落世界各地的数字节点,满足着特定区域内的资源共享需求。随着协作范围的扩大,跨地域的局域网间产生了交互需求,这种拓扑扩展最终催生了覆盖更广域的广域网(WAN)技术。网络技术从LAN到WAN的演进,本质上映射着人类协作边界不断突破物理空间限制的过程。

所谓"局域网"(LAN)和"广域网"(WAN)只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网。

二、协议

1.认识协议

"协议"是一种约定,计算机要进行交流就需要有协议,就像人与人之间要进行交流就需要有语言,而语言、手语、摩斯密码等这些都是人们的一种约定。

计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息, 要想传递各种不同的信息, 就需要约定好双方的数据格式。

但是只要两台主机约定好协议就可以了吗?

并不是的,如果你用频率表示 01, 我用强弱表示 01, 就好比我用中国话, 你用葡萄牙语一样, 虽然大家可能遵守的一套通信规则, 但是语言不同, 即是订好了基本的协议, 也是无法正常通信的。这就需要我们定制一个统一的协议或标准,通常是业界公认或者具有江湖地位的组织或者公司来做这件事情。比如有国际标准化组织IEEE,ISO等。

IEEE(电气和电子工程师协会) :这是一个由计算机和工程领域专家组成的庞大技术组织, 在通信协议领域贡献突出。 IEEE 制定了全世界电子、 电气和计算机科学领域 30%左右的标准, 包括 IEEE 802 系列标准, 这些标准涵盖了从局域网(LAN) 到广域网(WAN) 等多种网络技术。

ISO(国际标准化组织): ISO 是由多个国家的标准化团体组成的国际组织, 它在开放系统互连(OSI) 模型方面的工作尤为著名。 OSI 模型定义了网络通信的七层协议结构, 尽管在实际应用中, TCP/IP 协议族更为普遍, 但 OSI 模型仍然在学术和理论研究中占有重要地位。

2.OSI七层模型

协议分层好处

协议本质也是软件, 在设计上为了更好地进行模块化, 解耦合, 也是被设计成为层状结构的。

这样的话,层与层之间互不干扰,一层的改变不会牵扯另一层,可以随意切换。

事实上计算机内部的设备与设备之间也需要交互,同样需要协议。那么现在开启你的想象力,计算机之间的通信可以这样理解:把你的计算机硬件拆成各个小零件,然后你的内存在海南,CPU在东北,磁盘在新疆,它们之间用长长的线连接组成了你的计算机。

我的意思是,计算机内部冯·诺伊曼体系本身就是一个网络结构,网络通信本地计算机硬件之间的交互没本质区别,无非就是从非常短的距离变成了超长距离而已。然而距离一旦变长就会遇到很多新的问题,而协议就是用来解决这些问题的。

|-------------|----------|
| 如何处理数据? | 应用层... |
| 数据丢了怎么办? | 传输层 |
| 怎么定位目标主机? | 网络层 |
| 怎么解决当下要去哪里? | 数据链路层... |

3.TCP/IP 五层(或四层)模型

TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了 TCP/IP 协议簇。

TCP/IP 通讯协议采用了 5 层的层级结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求。

  • 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、 早期以太网采用的的同轴电缆(现在主要用于有线电视)、 光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。 物理层的能力决定了最大传输速率、 传输距离、 抗干扰性等. 集线器(Hub)工作在物理层。
  • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、 帧同步(就是说从网线上检测到什么信号算作新帧的开始)、 冲突检测(如果检测到冲突就自动重发)、 数据差错校验等工作. 有以太网、 令牌环网, 无线 LAN等标准.,交换机(Switch)工作在数据链路层。
  • 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层。
  • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机。
  • 应用层: 负责应用程序间沟通, 如简单电子邮件传输(SMTP) 、 文件传输协议(FTP) 、 网络远程访问协议(Telnet) 等. 我们的网络编程主要就是针对应用层。

在传输层最出名的协议是TCP,网络层最出名的协议是IP,所以把这个模型叫作TCP/IP模型。

4.协议本质

主机之间虽然系统可能不同,但它们的协议栈都是严格按标准实现的,所以它们可以互相通信。

协议的本质是结构体,系统之间使用相同的结构体,约定好各个字段的含义,那么数据从哪里来到哪里去,要怎么用,它们都能看懂。这就像一个快递单。

注:网络通信贯穿了整个操作系统。

三、网络传输流程

局域网(Local Area Network, LAN)是指覆盖范围较小(如家庭、办公室、校园等)的网络,其核心特点是高带宽、低延迟和私有管理。

局域网发展是从计算机之间在小区域上的合作,最初几乎每个区都有自己的协议,随着网络的发展很多区域之间也需要合作,那就需要统一的协议,所以有很多的协议都被淘汰,只有少部分被保留下来,如以太网,令牌环网,无线LAN等。

这里所指的协议都是在数据链路层的,接下来以以太网为例,给大家讲解数据的传输。

以太网这个名字的由来

19世纪,科学家们觉得宇宙里必须有一种介质叫**"以太"** ,光才得以传播,就像声音传播必须有介质一样。结果后来一群科学家一拍大腿:"这玩意儿根本不存在!"(迈克耳逊-莫雷实验室锤打脸)。但"以太"这词儿没退休,反而被程序员薅走了羊毛,计算机科学家弄出来局域网通信标准后给它起名为以太网,内涵一下物理圈。

1.MAC地址

MAC地址是用来标识计算机的唯一性,用48比特位储存,被写死在计算机网卡中,是全球唯一的。

如上是主机之间在数据链路层的通信,在一个局域网内主机A给主机E发数据,这个过程所有的主机都能看到(叫泛洪),但只有跟目标MAC值相同的才会去接收,其他主机相当于吃瓜群众。一个主机去接收不是发给自己的数据,这个过程就叫抓包。

那么试想一下如果很多台主机一起发数据会发生什么?所以

  • 以太网中,任何时刻,只允许一台机器向网络发送数据。
  • 如果多台同时发送,会发生数据干扰,称之为数据碰撞。
  • 没有交换机的情况下,一个以太网就是一个碰撞域。
  • 所有发送数据的主机要进行碰撞检测和碰撞避免。

所以这也是一个网用的人越多就越卡的原因。以太网本质就是共享资源,具有互斥属性。

2.协议栈

主机之间通信本质是协议栈在通信,我们把各主机都看做协议栈。

数据在走过每一层时都需要添加当层特有的字段,称为报头,除报头外的称为有效载荷,即

  • 报文=报头+有效载荷

注意:有效载荷是指该层的报头除外的部分,因为该层并不关心前面几层加了什么报头,都看做一块数据。

如下:

在不同层报文有不同的名称:

  • 数据链路层:数据帧。
  • 网络层:数据报。
  • 传输层:数据段。
  • 应用层:请求与应答。

细节1:

对于应用层协议除外的所有协议,要满足以下两点:

  • 报头要能做到和有效载荷分离的能力。
  • 报头中必须包含如何将自己的有效载荷交付给上一层的具体协议。

细节2:

  • 主机在数据链路层判断报文是否发给自己,不是就直接丢弃。

细节3:

  • 如上,整个数据的封装与解包的过程,相当于入栈与出栈。所以我想大家知道为什么叫协议了吧!

3.IP地址

IP地址分为IPv4和IPv6,用来标识计算机的唯一性,同样是全球唯一的,IPV4是4字节的空间,即2^32次方,随着全球的人数不断增加,IP地址开始不够用,后来我国推出了IPV6为16字节空间,但要推广的全世界仍然是一个难题。

我想大家现在会很疑惑,刚才不是讲了一个MAC地址是标识计算机的唯一性吗,现在怎么又来一个IP地址标识计算机的唯一性?

IP地址 vs MAC地址

1. 核心区别
  • IP地址 :负责全局寻址 ,标识通信的起点(源)和终点(目标),类似"出发地"和"最终目的地"。

    • 例子 :唐僧从东土大唐(源IP) 出发,最终目标是西天(目标IP),这两个地址在整个旅程中不变。
  • MAC地址 :负责局部寻址 ,标识每一段路程的直接上一站和下一站,类似"当前驿站"和"下一个驿站"。

    • 例子:从东土大唐到高老庄,再到流沙河......每一段的起点和终点MAC地址都会变化。
2. 具体通信过程类比

假设唐僧取经的路线是:
东土大唐 → 高老庄 → 流沙河 → 火焰山 → 西天

通信阶段 IP地址 MAC地址(当前跳) 解释
出发时 源:东土大唐 目标:西天 源MAC:大唐 目标MAC:高老庄 唐僧离开大唐时,只需知道第一站是高老庄(MAC地址指向直接下一站)。
到达高老庄后 源:东土大唐 目标:西天 源MAC:高老庄 目标MAC:流沙河 高老庄的人告诉他下一站是流沙河,MAC地址更新为新的"局部起点和终点"。
到达流沙河后 源:东土大唐 目标:西天 源MAC:流沙河 目标MAC:火焰山 流沙河的河神指引他去火焰山,MAC地址再次更新。
...... (IP始终不变) (MAC逐段更新) 直到最终抵达西天。
3. 关键总结
  • IP地址:像"终极目标",全程不变(唐僧始终牢记要去西天)。

  • MAC地址:像"路标",每到一个新地方就问:"下一站怎么走?"(MAC地址动态更新,确保每一步不迷路)。

  • 网络通信:数据包像唐僧,IP决定最终去向,MAC决定如何走到下一跳(路由器或交换机)。


MAC地址 IP地址
物理地址,固化在硬件中 逻辑地址,可动态分配
用于同一局域网内的直接通信 用于跨网络的路由通信
数据链路层(OSI第二层) 网络层(OSI第三层)

为什么需要两者?

  • IP地址 是逻辑上的全局定位,但实际网络中数据包需要经过多个设备(路由器、交换机),这些设备之间需要通过MAC地址在本地网络中准确传递数据。

  • 就像唐僧不能直接"瞬移"到西天,必须依赖每一站的指引(MAC地址),而IP地址保证他最终不会走偏。

4.协议栈图解

如上图,数据在网络层添加报头时带有源IP和目标IP,在数据链路层发现目标IP不是不是局域网内IP,然后添加MAC目标地址为路由器。传输到路由器后,路由器解包 ,分析目标IP后重新封装 ,即加报头,此时传到另一个局域网,注意它封装的这个报头的协议已经不是原来局域网用的协议了,而是新局域网用的协议。

所以局域网之间尽管用不同的协议也无所谓,在路由器这里会进行重新封装。从另一层面也说明了为什么有MAC地址还要在网络层加IP地址好处,它让世界的所有网络都是 IP 网络

,屏蔽最底层网络的差异。

Socket编程

1.端口号

我们上网本质就是做两台主机的交互,一个是本地,一个是远端,即客户端与服务器。但是一个主机上客户端是有很多的,比如:QQ,微信,抖音,爱奇艺等。服务器同样有很多,QQ,微信,王者荣耀等。

所以一个数据传输到目标主机还不够,还要把数据送入正确的服务器或客户端。

服务器和客户端的本质是什么?是一个程序,即进程。所以数据发送除了需要目标主机还需要目标进程。也就有了端口号用来标记一个主机内的唯一进程,端口号即port。

总结:IP+port可以确定全球唯一的进程。

  • 细节1:一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定。。
  • 细节2:虽然进程里面有进程ID标识进程唯一性,但进程 ID 属于系统概念, 用它来标识唯一性会让系统进程管理和网络强耦合, 实际设计的时候,并没有选择这样做。

端口号是多少字节,怎么分配的?

端口号在TCP/IP协议中是一个16位无符号整数 ,占用2字节 ,取值范围为 0~65535(即 12^16−1)

一个主机内的进程是有生命周期的,这也决定了端口号是动态绑定的。可以由系统随机分配和绑定,也可以有程序员自己绑定。但端口号0~1023是**知名端口,**不可以由我们把它绑定到进程,就像我们不能把110、120、119作自己的电话号码一样。只有1023以后才能有我们绑定。

2.TCP/UDP协议

在传输层有TCP/UDP协议,我们先做简单了解,它们的特性如下:

特性 TCP UDP
连接性 面向连接(需三次握手建立连接) 无连接(直接发送数据)
可靠性 数据可靠传输(确认、重传、校验) 不保证可靠性(可能丢包、乱序)
传输效率 低(因额外控制机制) 高(无复杂控制流程)
数据边界 字节流(无固定边界) 数据报(保留发送边界)

3.网络字节序

在计算机中并没有规定在储存一个数据时是把高位储存在地址还是低地址,所以就有了大端机和小端机,小端是低地址存放低位,巧记"小""小""小",其他情况为大端机。

在网络通信,即计算机之间要进行交互,就需要解决一个存储方式不一致问题,统一规定使用大端存储,即网络字节序,在计算机把数据丢入网络前要把数据转化为大端模式。

网络字节序=大端模式。

4.sockaddr 结构

sockaddr 结构是网络编程中用于表示套接字地址的通用数据结构。

它既可以用做网络通信,可以用作本地通信。它的实现具有多态的性质。如下:

sockarr_in是网络通信的套接字,socket_un是本地通信的套接字。类型转化为sockaddr后通过头16位地址判断出类型。

相关推荐
工画师10 分钟前
Xray 部署记录
运维
珹洺14 分钟前
Jsp技术入门指南【九】详细讲解JSTL
java·linux·开发语言·前端·jsp
红狐寻道17 分钟前
“vcpkg install”失败问题记录
c++·后端
者行孙17 分钟前
C++ 随机数生成的陷阱
c++
末央&23 分钟前
【C++】深入浅出之多态
开发语言·c++
zdsji23 分钟前
从零开始物理引擎(六)- 重构完成与MVP理解
c++·算法·重构·ue5·游戏引擎
私人珍藏库25 分钟前
[Windows] Wireshark 网络抓包工具 v4.4.6
网络·测试工具·wireshark
乌萨奇也要立志学C++26 分钟前
【C++详解】C++入门(一)
c++
zyhhsss26 分钟前
大模型应用开发自学笔记
网络·人工智能·笔记·神经网络·学习·自然语言处理
梁萌34 分钟前
DevOps-文章目录
运维·devops