Linux:初识计算机网络


网络发展

独立模式: 计算机之间相互独立

在这里插入图片描述

网络互联: 多台计算机连接在一起, 完成数据共享;

在这里插入图片描述

局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起;

在这里插入图片描述

  • 交换机:实现主机之间的数据交换

  • 路由器:不但时间数据交换,并且实现数据的路径选择

  • 网络以覆盖范围划分:局域网(1KM内),城域网(10KM内),广域网

  • 组网方式:以太网/令牌环网

网络通信

在复杂的网络通信中,必须保证每个主机都有自己唯一的标识,只有这样才是实现精确的点对点通信

通过IP地址和端口可以实现不同主机之间的进程间通信了

IP地址

网络中主机的唯一标识 - IP地址

  • IPV4:uint32_t — 无符号四个字节的整数(不到43亿) - IP地址是不够用的

我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个 字节, 范围是 0 - 255;

DHCP - 动态地址分配技术;NAT:网络地址转换技术

  • IPV6:uint8_t addr[16] 但是不向前兼容IPV4 - IPv6的地址长度为128位,是IPv4地址长度的4倍

网络通信中的每条数据都必须具备:

源IP地址/目的IP地址 - 表示数据从哪个主机来,到哪个主机去

  • 目的IP地址:能够让网络中的路由器为每一条数据根据目的地址选择不同的路径到达对端主机
  • 源IP地址:能够让对端主机知道数据是谁发送,以便于回复数据
端口

主机如何确定由哪个进程处理数据 - 端口

IP地址使网络中主机与主机之间的通信,但是主机上有很多进程。所以通信中必须标识一条数据应该由哪个进程处理

概念:

在一台主机上唯一标识一个进程,当操作系统接收到一条网络数据能够知道应该交给哪个进程处理

  • 类型uint16_t 无符号两个字节的整数 0~65535

  • 特性:一个进程可以使用多个端口,但是一个端口只能被一个进程占用

  • 网络中的每条数据都必须具备:源端口/目的端口(标识数据从哪个进程中来,到哪个进程去)

IP地址 + 端口号能够标识网络上的某一台主机的某一个进程

提问:为什么不使用pid标识进程?

进程每一次的重新 pid 都会发生变化,但是端口不会

网络字节序

字节序概念:

cpu对内存中的数据进行存取的顺序(取决于cpu的架构)

  • x86-小端
  • MIPS-大端

字节序分类:

0x01020304 — 01是高位;04是低位
uchar a[4] — a[0] - 低地址;a[3] - 高地址

  1. 大端字节序:低地址存高位

a[0] = 01;a[1] = 02;a[2] = 03;a[3] = 04

  1. 小端字节序:低地址存低位

a[0] = 04;a[1] = 03;a[2] = 02;a[3] = 01

低地址和高地址:指的是一个数据在内存空间中使用的地址是从低到高的
低位和高位:指的是一个数据的二进制位从右到左,是越来越高的

网络字节序:

内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
    在这里插入图片描述

为了防止网络通信中因为两端主机的主机字节序不同而造成数据二义所订立的标准

  • TCP/IP协议规定,不管两端通信主机是大端还是小端,反正在网络通信的时候都要讲数据转换为网络字节序(大端字节序)然后再进行传输
  • 接收端接收到数据之后,从网络字节序转换为主机字节序再进行处理

并不是所有的数据都需要转换,需要转换的数据关键点在于内存中一次存储单位大于一个字节的数据:short/int/long/float/double ;

字符串char buf[1024]是按字节为存储单位,因此字符串不涉及字节序转换

如何判断一个主机的字节序是大端还是小端
#include <iostream>
using namespace std;

union tmp {
	int a;
	char b;	// b 就是 a[0]
}tmp;

int main() {
	tmp.a = 1;
	
	if (tmp.b == 1) {
		cout << "计算机是小端字节序\n";
	}
	else {
		cout << "计算机是大端字节序\n";
	}
	return 0;
}

协议(约定)

网络通信协议:网络通信中数据格式的约定

  • 计算机生产厂商有很多;
  • 计算机操作系统, 也有很多;
  • 计算机网络硬件设备, 还是有很多;
  • 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议;

例如

两个不同地区的人使用普通话通话- --普通话就是通信协议

协议分层
  • 对通信协议在不同的通信环境中进行封装,不同层次使用不同协议,提供不同的服务
  • 将通信环境划分出来通信的实现更加简单,更容易形成规范

在这里插入图片描述

  • 这个例子中, 我们的协议只有两层(实际的网络通信会更加复杂, 需要分更多的层次)
  • 分层最大的好处在于 “封装” . 面向对象例子
网络通信环境中的协议分层:

OSI七层模型:

应用层/表示层/会话层/传输层/网络层/链路层/物理层

在这里插入图片描述

TCP/IP五层模型:

应用层/传输层/网络层/链路层/物理层

TCP/IP是一组协议栈/协议簇: 其中包含许多协议,IP和TCP协议只是其中比较典型的两种而已

  1. 应用层:负责应用程序之间的数据沟通(描述应用数据如何组织解析以及描述信息)

典型协议:

  • HTTP(超文本传输协议): web服务器用这种协议和浏览器交互
  • DNS(域名解析服务): 将域名解析为ip地址
  • FTP(文件传输协议): 可以在下载或上传文件的时候使用

例如:

qq是一个应用程序,qq与qq之间的通信使用的协议就是qq的协议;应用程序是程序员编写的,因此应用层的协议也是程序员自己定义的。

  1. 传输层:负责不同主机上进程间的数据传输(描述端口信息标识从哪个进程到哪个进程)

典型协议:

  • TCP(传输控制协议): 面向连接、可靠传输、面向字节流
  • UDP(用户数据报协议): 无连接、不可靠、面向数据报

例如:

qq发送的数据保证是发送给qq的,而不会发送给其他程序。

传输层的协议都会包含有端口信息

  1. 网络层:负责地址管理与路由选择(描述IP信息标识从哪个主机到哪个主机)

典型协议: IP(网际互连协议)

设计IP的目的是提高网络的可扩展性

  • 解决互联网问题,实现大规模、异构网络的互联互通
  • 分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展

典型设备:路由器(实现数据的路由转发)

网络层的协议都会包含有IP的地址信息

  1. 链路层:负责相邻设备之间的数据帧识别以及传输(描述MAC地址信息从哪个设备到哪个设备)

典型协议: Ethernet(以太网协议)

典型设备:交换机

  1. 物理层:负责物理光电信号的传输

典型协议:以太网协议(计算机局域网技术)
典型设备:集线器(将多根网线集合成一根)

在这里插入图片描述

协议分层:

根据提供的服务不同,分出不同的通信层次,在每个层次使用不同的协议实现数据格式约定 – 将复杂的网络通信环境简化清晰

网络通信中的数据传输流程

在这里插入图片描述

  • 发送端主机的层层数据封装: tcp/ip模型中的五层,层层对原始数据进行描述
  • 接收端主机的层层数据分用: tcp/ip模型中的五成,层层对网络数据进行解析得到原始数据的过程

知识点习题

  1. 在网络应用测试中,网络延迟是一个重要指标。以下关于网络延迟的理解,正确的是___

A.指响应时间
B.指报文从客户端发出到客户端接收到服务器响应的间隔时间
C.指报文在网络上的传输时间
D.指从报文开始进入网络到它开始离开网络之间的时间

正确答案:D

答案解析:

定义:在传输介质中传输所用的时间,即从报文开始进入网络到它开始离开网络之间的时间。

  1. 在公司局域网上ping www.bilibili.com 没有涉及到的网络协议是?()

A. UDP
B. DNS
C. ICMP
D. RARP

正确答案:A

答案解析:

ping使用了协议ICMP

  • ICMP的一个重要应用就是分组间探测PING,用来 检测两主机间的连通性
  • ping使用了ICMP回送请求和回送回答报文,是应用层间使用网络层ICMP的一个例子,并没有通过运输层的TCP/UDP

ping后地址:使用DNS协议将域名【应用层】转换为ip地址【网络层】,获取ip地址后在数据链路层用MAC地址【数据链路层】进行传输【这里用到ARP地址解析服务】

  • DNS:域名—>IP地址
  • ARP:IP—>MAC
  • RARP:MAC---->IP
  1. 关于操作系统原理中,以下说法正确的是?

A. 进程调度算法:多级反馈队列不会出现“饥饿”现象
B. 进程间可以通过全局变量,静态变量共享数据
C. 内存池是为了解决内存管理中碎片化问题
D. 同步是非阻塞的,无需等待

正确答案: C

答案解析:

多级反馈队列会出现“饥饿”现象

各个进程间全局变量、静态变量的值是 不共享 的:这是因为每创建一个进程就会 copy 一份原始代码(全局变量还是初值)给自己使用,所以进程间的代码是一样的,但 变量和数据是独立

内存池的使用是为了解决以下两个问题:

  • 内存碎片(Fragment),内存碎片会导致分配大块内存失败
  • malloc和free比较慢

同步:处理流程中,顺序处理,一个完成之后再完成下一个,因为所有功能都由进程自身完成(所以是阻塞的)


如果本篇博文有帮助到您,请留个赞激励博主呐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值