计算机网络基础及应用

计算机网络学习的核心内容就是网络协议的学习,而网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合.

目录:


传输#

什么是网络就不解释,直接从传输开始。

一份数据是如何在网络上传输的呢?比如平时发送的一张图片一个文本,是如何传输出去的呢?

在网上有两套协议模型:

  • 第一个则是 ISO参考模型: (国际标准,但是复杂并且发展缓慢,作为教科书内容了解一下)
ISO七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
  • 第二个则是 TCP/IP:(这个是现实)
TCP/IP
应用层 应用程序 HTTP,DNS,FTP,SSH,TELNET
传输层 操作系统 UDP,TCP
网络互连层 操作系统 ARP,IP,ICMP
网络接口层 设备驱动,网络接口 以太网,WIFI,PPP
硬件层 设备驱动,网络接口

TCP/IP模型的工作过程:

应用层上面承担着我们平时使用的网络应用,数据传输时,应用层数据在传输层(端口)加上了 TCP/UDP数据头,并进行了包装。

然后数据进入网络层,网络层遵循了IP协议,数据再次被加上 IP数据头 并进行了包装。

然后进入了链路层,加上了包含MAC地址的 以太网数据头,这个数据包才会正式的投入以太网。

以上为数据的发送,而数据的解析则是以上过程的逆向。

以太网#

PC —双绞线—> 交换机 —> 光纤 —> 交换机 —双绞线—> PC

PS.

网线并非直接连接PC的,而知连接 网卡 的。

每一块 网卡 都有设备商设定的唯一标识符,这个标识符就是 MAC地址(物理地址) 格式如:00-01-6C-06-A6-29

MAC 地址是可以被修改的

IP协议#

IP地址#

IP地址由32位二进制数据组成,分为主机标识网络标识 同时提供了一套子网掩码,对应位置为“1”的时候是网络标识,“0”为主机标识

举个例子啊:
一个IP地址: 192.103.0.1 (11000000.01100111.00000000.00000001)

子网掩码:255.255.255.0(11111111.11111111.11111111.00000000)

根据
1 对应网络标识
0 对应主机标识

则 11000000.01100111.00000000(192.103.0) 为网络标识
00000001(1) 是主机标识

以上通常简化为 192.103.0.1/24 (前24位是网络标识)

寻址和传输#

在数据传输中:

同网络下的简单传输:
PC —> 交换机 —> PC

PC的数据被包装后,通常包含各个协议相关的数据头,其中包含了 源IP地址 | 源MAC地址目标IP地址。此时的目标MAC地址时不知道的。

接着网关会向交换机发送一个 ARP Request

ARP Request的格式如下:

IP地址 XXX.XXX.X.X
MAC地址 XX-XX-XX-XX-XX-XX
目标
IP地址 XXX.XXX.X.X
MAC地址

交换机本身有一个MAC地址表。当收到 ARP Request 后就会先更新这个MAC地址。

同时开始在连接入这个交换机的PC中发送这个 ARP Request 。当有个PC发现这个 ARP Request 的目标与自己是符合的时候,变会将自己的MAC地址填入这个 ARP Request 中,然后送回交换机。

交换机发现新的MAC地址继续更新MAC地址表。

目标MAC地址和IP地址都知道了,就可以直接将数据顺利的从PC传输到目标PC

在复杂的网络环境中(真实网络)

PC —> 交换机 —> 路由1 —> 路由2 —> … —> 路由n-1 —> 路由n —> 交换机 —> PC

此时的传输则是一步一步传输的,每一个PC/路由 —> PC/路由 都进行了一次简单传输中类似的步骤。

有些不一样的是,路由本身有一份路由表,路由表则会记录下一个传输对象(非自连就传给目标路由,直连就传给目标交换机)

数据分片和重组#

在数据发送中,通常数据都是体积很大的,所以需要分片发送,然后最后在目标PC中重组。

TCP/UDP#

端口#

常见保留端口:

端口 名次 作用
21 FTP 文件传输
22 SSH 命令行远程登录
25 SMTP 邮件发送服务
80 HTTP WEB服务
110 POP3 邮件接收服务
139 SMB SAMBA共享
143 IMAP 邮件接收服务
443 HTTPS 加密网站服务
3306 MySQL 数据库服务
3389 RDP 远程桌面服务
6379 Redis 缓存服务器
8080 Proxy 代理服务器

UDP#

Header构成:

校验和:占16比特。用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的

TCP#

流程

seq:顺序码
ack: 响应码

创建连接:三次握手

  • 客户端–发送带有SYN标志的数据包–一次握手–服务端
  • 服务端–发送带有SYN/ACK标志的数据包–二次握手–客户端
  • 客户端–发送带有带有ACK标志的数据包–三次握手–服务端

发送数据:ACK ack=1+22 的原因,是因为服务端需要根据这个知道客户端收到的数据大小

关闭连接:四次挥手

  • 客户端-发送一个FIN,用来关闭客户端到服务器的数据传送
  • 服务器-收到这个FIN,它发回一个ACK,确认序号为收到的序号加1 。和SYN一样,一个FIN将占用一个序号
  • 服务器-关闭与客户端的连接,发送一个FIN给客户端
  • 客户端-发回ACK报文确认,并将确认序号设置为收到序号加1

HTTP/HTTPS#

HTTP#

Http协议是建立在TCP协议基础之上的,当客户端需要从服务器获取数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接(无状态连接 即 每次都是一个新连接,数据完了后就释放相关内容,不保留状态)。

HTTPS#

HTTPS是基于SSL层的HTTP,为HTTP的安全版。

与HTTP的不同点:

  • HTTPS需要到CA申请认证证书,通常均为收费证书。
  • HTTPS是SSL加密传输,非HTTP那种明文传输。
  • 使用的端口号也不同,HTTPS是443端口,HTTP是80端口。

HTTPS的安全#

SSL:Secure Sockets Layer (安全套接层)

TLS:Transport Layer Security (传输层安全)

SSL和TLS在传输层之上对网络连接加密从而提供网络安全

在HTTPS中,在HTTP封装后,会在 SSL&TLS 中间层加密,之后才会进入TCP层。

HTTP结构 HTTPS结构
HTTP HTTP
TCP SSL&TLS
IP TCP
IP

而SSL则混合使用了 非对称加密 和 对称加密 技术对内容进行了加密。

公钥/私钥#

属于非对称加密中的术语。

在非对称加密中,使用公钥对明文加密,然后使用私钥对其解密,常见算法有RSA。

对称加密:
(使用同一个秘钥的对称加密)

iOS中的网络请求#

  • NSURL 【根据不同的协议封装url字符串的对象】
  • NSURLRequest 【NSURL的基础上添加了各种请求参数和设置,形成一个请求】
  • NSURLSession 【接受,发送和处理请求,封装Request为Task,然后做处理】

URL格式:

作用:资源定位

[协议类型]://[服务器地址]:[端口号]/[资源层级文件路径]/[文件名]?[查询]#[相关ID]

https://192.163.0.1:8080/files/net.md?name="boy"#nose

简单应用(delegate方式):

请求

1
2
3
4
5
6
NSURL *url = [NSURL URLWithString:@"https://api.steampowered.com/ISteamWebAPIUtil/GetSupportedAPIList/v0001/?format=json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue new]];
NSURLSessionDataTask *datatask = [session dataTaskWithRequest:request];
[datatask resume];

回复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//代理

- (void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler {
completionHandler(NSURLSessionResponseAllow);
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"%@",dic);
//返回内容
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error {
NSLog(@"%@",error);
//error
}

Block方式:

1
2
3
4
5
6
7
8
9
NSURL *url = [NSURL URLWithString:@"https://api.steampowered.com/ISteamWebAPIUtil/GetSupportedAPIList/v0001/?format=json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *datatask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"%@",dic);
}];
[datatask resume];

iOS中的网络层设计#

很多iOS开发问题,都可以用中间层来解决。iOS中的网络请求设计也是如此。

在业务方面的网络层,通常有三个要点:

  1. 请求接口
  2. 数据回调
  3. 数据转换

请求接口#

请求接口,即网络层调用接口输入参数,通常有两张设计方式。

  • 集中式

    所有参数通过一个接口输入。

    好处则是参数明确,使用简单。
    缺点也是请求太多后会变得臃肿复杂。

    1
    2
    3
    4
    + (void)requestWithURLString:(NSString *)urlString
    Parameters:(NSDictionary *)parameters
    SuccessHandler:(void (^)(id responseObject))successHandler
    FailureHandler:(void (^)(NSError *error))failureHandler { }
  • 分布式

    设计一个请求基类,然后根据不同的业务设计一个继承自基类的业务请求类,在各自的业务中直接实例化这个业务请求类获取网络数据。

    好处非常明显, 让请求网络的业务中,代码量减少,设计更加的优雅轻盈,可扩展性也强。
    缺点则是当业务非常的多的时候,必然会导致类爆炸,同时维护上百个业务请求类。

1
2
3
NewsRequestService *request = [[NewsRequestService alloc] init];
[request requestCompletionHandler:^(id responseObject, NSError * error) { }];
[apiPost start];

数据回调#

网络层的传输大多以异步加载为主,即服务器响应后由网络层来负责将数据推给上层业务线程。因此,在回调方案中,Block Delegate Notification 均是不错的选择方案,可以根据不同的实际情况做选择。

数据转换#

这个其实是一个返回数据处理问题。通常我们并不是将服务端返回的数据直接拿出来用的,而是转换成 NSDictionary 或者 Model。而这个返回 可用数据 的过程也是网络层需要处理的地方之一。

Apple Push Notification service 色彩笔记

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×