网络基础

目录

网络基础

一、计算机网络背景

1.1.网络发展

二、网络协议

2.1.协议初识

2.2.协议分层

2.3.OSI七层模型

2.4.TCP/IP五层模型

2.5.TCP/IP协议的诞生

2.6.TCP/IP与操作系统

三、网络传输基本流程

3.1.局域网通信原理

3.2.网络协议栈

3.3.网络中的地址管理

四、socket编程基础

4.1.源IP与目的IP地址

4.2.端口号

4.3.端口号 VS PID

4.4.socket套接字

4.5.传输层的典型代表

4.6.网络字节序

五、socket编程接口

5.1.socket常见API

5.2.sockaddr结构


一、计算机网络背景

1.1.网络发展

早期通过软盘对计算机数据进行拷贝,中间需要人的参与,效率低下

计算机是人类的工具,人需要协作,注定计算机之间要协作

所以网络的产生是必然的,从局部开始产生,再发展到整体

网络发展:

美国军方创建阿帕网,90年代公开后,组件了互联网,在世界商业化

随着路由器、交换机这些新网络设备的诞生,许多通信厂商得到发展

比如:华为、诺基亚,生产网络通信设备,进而使运营商也开始发展

比如:联通、电信、移动,进行大量的基础设施建设,比如通信设施

独立模式:

计算机之间相互独立

网络互联:

多台计算机连接在一起,完成数据共享

局域网LAN:

计算机数量更多,通过交换机和路由器连接在一起

广域网WAN:

将远隔千里的计算机连在一起

二、网络协议

2.1.协议初识

协议的本质:一种约定,减少通信的成本,用于快速形成共识

计算机之间的传播媒介是光信号和电信号

通过"频率"或''强弱"来表示0和1这样的信息

完善的协议需要更多更细致的规定,并且让参与的人都要遵守

计算机的生产厂商、计算机的操作系统、计算机的网络设备

如何让这些不同厂商之间生产的计算机能够相互顺畅地通信

就需要约定一个共同的标准,让各厂商遵守,就是网络协议

网络协议的标准:多种局域网通信标准+一种广域网通信标准

ISO(国际标准化组织):OSI模型定义了网络通信的七层协议结构,只生产标准,不实现代码

2.2.协议分层

协议也是软件,在设计上为了更好地模块化,解耦合,也是层状结构

分层之后可以无障碍地替换任意一层,实现分层解耦,增强可维护性

  • 普通用户视角:

两个人之间在直接通信,两个电话之间在直接通信

在用户层的视角下,只有同层之间才能够之间通信

  • 工程师视角:

将人说的话交给电话机,电话机将声音采集,压缩,加密后

通过特定的协议方式,将声音信息发送到另一个人的电话机

对方通过解密,解压,通过听筒将声音播放,获取声音信息

2.3.OSI七层模型

OSI(Open System Interconnection):开放系统互联

2.4.TCP/IP五层模型

五层模型:物理层(不关注)、数据链路层网络层传输层应用层(包含表示层和会话层)

物理层:负责光电信号的传递方式,决定了最大传输速率、传输距离、抗干扰性,是集线器的工作

数据链路层:负责设备之间数据帧的传输和识别,网卡驱动、帧同步、冲突检测,是交换机的工作

网络层:负责地址管理和路由选择,通过IP地址表示主机,通过路由表规划线路,是路由器的工作

传输层:负责两台主机的数据传输,通过TCP传输控制协议,使数据可靠的从主机发送到目标主机

应用层:负责应用程序之间的沟通,比如:电子邮件传输、文件传输协议、网路远程访问协议

2.5.TCP/IP协议的诞生

本地通信:所有的计算机设备通过线连接起来(I/O总线、系统总线)

计算机中的冯诺依曼架构,本身就是一个通过总线连接的网络架构

通过内部的硬件协议(内存与其他设备、磁盘与其他设备)来通信

网络通信:多台主机通过网络通信,其本质也是从设备到设备

与本地通信的唯一区别在于线变长了,主机间的距离变远了,就会有新的问题产生

  • 问题1:如何处理收到的数据呢 —— 应用层
  • 问题2:在传输时数据丢失问题 —— 传输层
  • 问题3:如何定位目标主机问题 —— 互联网层
  • 问题4:如何确定当下要去哪里 —— 网卡层

TCP/IP协议的本质:一种网络长距离通信的解决方案

2.6.TCP/IP与操作系统

操作系统中存在许多协议,网络中还有报文,报文中存在许多协议字段

操作系统需要对协议与报文进行管理,先描述,再组织

协议的朴素理解:通信双方都认识的结构化的数据类型

结构体是协议约定的计算机表达,通过结构体对象来建立共识

快递单用C语言表示就是一个struct结构体

快递单就是收发双方的一种协议

三、网络传输基本流程

3.1.局域网通信原理

 局域网通信的标准

  • 以太网(Ethernet)
  • 令牌环网
  • 无线LAN(WiFi)

每台主机在局域网中,都要有一个唯一的网卡标识符来确保主机唯一性:MAC地址

MAC地址用来识别数据链路层中相连的节点,长度为6个字节

MAC地址在网卡出厂时就确定了,不能修改,通常是唯一的

在同一个局域网的两台主机能够直接通信

一台主机向局域网内所有主机发送含有目标主机的信息,只有目标主机处理,其他主机抛弃  

以太假说:以前物理学家猜测宇宙充满一种叫"以太"的介质,认为光必须靠以太传播

(迈克尔逊-莫雷实验否定了以太的存在)

以太网中,任何时刻只允许一台机器向网络发送数据

当多台同时发送,会发生数据干扰,称之为数据碰撞

在没有交换机的情况下,一个以太网就是一个碰撞域

所有发送数据的主机要进行碰撞检测碰撞避免(碰撞避免算法)

以太网的本质是共享的资源,即临界资源,通过碰撞检测和碰撞避免维持互斥属性

3.2.网络协议栈

主机之间通信本质:两个网络协议栈在通信,数据发送的原始动力主要是用户

网络协议栈的每一层都要有对应的协议,协议信息被称为协议报头(结构体变量)

报文:协议报头 + 有效载荷

用户发送的数据,必须贯穿网络协议栈(操作系统是网卡的管理者),由网卡发送给目标主机

发送端自顶向下封装报文(入栈),接收端同层解包,将报头和有效载荷进行分离(出栈)

同层之间都认为自己在和对方同层协议在直接通信

不考虑应用层协议,任何协议都包含了两种字段

  • 报头必须要做到能和有效载荷进行分离的能力
  • 报头必须要将自己的有效载荷交付给上层的一个具体的协议

底层收到的报文如果不是发给该主机,主机在数据链路层就会将报文丢弃

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

网卡的驱动程序默认只把发送给目标主机的报文向上交付

但网卡的混杂模式会无脑地将收到的报文向上交付(抓包工具原理)

  • 整体框图

  • 数据封装

  • 数据分用

3.3.网络中的地址管理

IP协议:IPv4(4字节)和IPv6(16个字节)版本,默认指IPv4

IP地址用来标识全球范围内主机的唯一性

IPv4协议的IP地址是一个4字节的32位整数

点分十进制的字符串表示IP地址,每一个数字表示一个字节(0 ~ 255)

例如:192.168.0.1

下图的路由器含有IP地址和两张网卡,分别连接以太网和令牌环网这两个子网

同一个子网,它的IP地址的前几位是类似的,只要有网络层,就会有路由功能

源IP为198开头的主机A并不知道上层交付的目标IP为172开头的主机B在哪里

但主机A一定能确定,报文绝对不是发给本地网络的主机的,因为IP开头不同

所以主机A一定会把报文发送给路由器,路由过程中,IP地址不变、MAC地址

一直在变,MAC地址只会在本地局域网中有效

网络层 + IP的本质意义:给网络封装一个虚拟层,让世界所有网络都叫做IP网络

(网络的底层可以是以太网、无线LAN、令牌环,而从网络层往上都只有IP网络)

四、socket编程基础

4.1.源IP与目的IP地址

数据传输到目标主机不是目的,用户使用数据才是目的

比如:QQ聊天是用户在聊,浏览器网页是用户在看

用户通过启动QQ、浏览器进程,看到聊天信息、网页信息

进程是用户在系统中的代表,进程获取数据相当于用户获取数据

所以数据传到主机是手段,数据交给主机内的进程才是最终目的

上网只有两种行为

  • 从远端服务器获取数据下载
  • 将本地数据上传远端服务器

进程(内存)<=>  网卡  <=> 网络

网络通信的本质:两个不同主机的进程进行数据交互(I/O),即进程间通信(IPC)

让不同的进程看到同一份资源:网络

4.2.端口号

端口号(port):传输协议层的内容,为2个字节的16位整数

作用:用来标识一个进程,告诉OS当前的数据要交给哪个进程处理

  • 0 ~ 1023:知名端口号,比如HTTP,FTP,SSH等应用层协议,它们的端口号固定
  • 1024 ~ 65535:操作系统动态分配的端口号,客户端程序的端口号

4.3.端口号 VS PID

不是所有的进程都要进行网络通信

PID是一个系统的概念,如果将来在系统层发生变化,那么在网络层也要改变

设计端口号,就可以将进程标识在系统层与网络层进行解耦合

一个进程PID可以绑定多个Port端口号,但一个Port端口号只能标识唯一的进程

4.4.socket套接字

网络通信:互联网内唯二的两个进程在进行进程间通信,使用IP + port标识唯一性

IP地址+端口号:表示互联网中某一台主机的某一个网络进程

{srcIP,srcPort,dstIP,dstPort}:这样的4元组表示互联网内唯二的两个进程

socket套接字: IP地址 + port端口号

4.5.传输层的典型代表

传输层是属于操作系统内核的

如果通过网络协议栈进行通信

要调用传输层提供的系统调用

TCP协议(Transmission Control Protocol):传输控制协议

特点:有连接(电话)、可靠传输(丢了、超时了会重传)、面向字节流(接自来水)

做更多工作,复杂且占用资源多,使用场景:支付交易

UDP协议(User Datagram Protocol):用户数据报协议

特点:无连接(对讲机)、不可靠传输(丢了、超时了不管)、面向数据报(快递、信封)

多更少工作,简单且维护性强,使用场景:直播流媒体

4.6.网络字节序

内存中的多字节数据相对于内存地址有大小端之分

磁盘文件中的多字节数据相对于文件中的偏移地址有大小端之分

网络数据流也有大小端之分

发送主机将缓冲区的数据按内存地址从低到高发出

接收主机将字节按内存地址从低到高保存到缓冲区

网络数据流规定:先发出的数据是低地址,后发出的数据是高地址

TCP/IP协议规定,网络数据流采用大端字节序,所有发送到网络上的数据都必须是大端的

为了使网络程序具有可移植性,同样的C代码在大端和小端计算机都能允许,可调用库函数做

网络字节序和主机字节序的转换

h表示host主机,n表示net网络,l表示32位长整数,s表示16位短整数

htonl:将32位长整数从主机字节序转为网络字节序

主机为小端,将参数做相应大小端转换后返回

主机为大端,将参数原封不动地返回,不转换

五、socket编程接口

5.1.socket常见API

// 创建 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.2.sockaddr结构

System V标准:本地进程间通信

POSIX标准:网络进程间通信(也能进行本地通信)

socket会有很多的种类来满足不同的应用场景

  • 网络socket
  • 本地socket(Unix域间通信)
  • 原始socket

而socket的设计者指向提供一种通信接口

如果address→sin_family == AF_INET,则为网络通信

如果address→sin_family == AF_UNIX,则为本地通信

本质就是:继承 + 多态

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐