OC网络学习01:TCP/UDP/HTTP/HTTPS/Socket/WebSocket/WebService探索
OSI模型
网络协议从低到高:
- 物理层
- 数据链路层
- 网络层(IP)
- 传输层(TCP/UDP)
- 会话层(SSL/TLS)
- 表示层
- 应用层(HTTP/DNS/WebSocket)
问:那么SSL和TLS在哪一层呢?
答:SSL/TLS作用于应用层和传输层之间,如果硬要说在哪个位置,那就是:会话层
URL
URL
全称是Uniform Resource Locator
(统一资源定位符),通过一个URL能找到互联网唯一一个资源
,URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URLURL基本格式 = 协议://主机地址:端口号/路径
例如: http://www.bboyzj.top:80/2020
- 协议:不同协议,代表着不通的资源查找路径、传输路径
- 主机地址:存放资源的主机(服务器)的IP地址(域名)
- 端口:跟在域名后面的是端口,默认是省略的
- 路径:资源在主机(服务器)中的具体位置
物理层
把MAC帧变成二进制比特流,并转换为电信号,在物理链路传输
数据链路层(MAC)
MAC帧是数据帧的一种。而所谓
数据帧
,就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾
。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如ip数据包
。在
发送端
,数据链路层把网络层传下来得数据封装成帧
,然后发送到链路上去;在接收端
,数据链路层把收到的帧中的数据取出并交给网络层。不同的数据链路层协议对应着不同的帧,所以,帧有多种,比如PPP帧、MAC帧等,其具体格式也不尽相同。
IP(网络层协议)
IP
是网络层协议
。比作:高速公路
网络传输需要解决的主要问题有两个: 发给谁 和 通过怎么样的路线才能发给他(也就是路由)。
- IP的作用
我们先来看一下TCP/IP封装的数据包结构:
当我们 发送数据
时,按照 应用层 —>数据链路层自上而下封装数据包
。
当我们 接收数据
时,按照 数据链路层 —>应用层 进行拆包
。
每个 网卡
在出厂时就会有一个 全世界唯一的MAC地址
,就相当于是我们每个人在世界上都是唯一的。那MAC地址其实就能解决第一个 发给谁
的问题。那为啥还需要IP层呢?
想象你到世界上找一个叫 Monica 的人,你不可能大街上随便逮到一个人就问你认识 Monica 吗.. 你应该先搞清楚 Monica 住址是在哪个国家哪个城市哪个区哪个街道,从国家->城市->区->小区一步步定位,这么找人就符合常理了。。IP解决的就是网络上数据包的路由定位困难问题
。
- IP的定义
IP
怎么表达出 国家城市区
的概念呢,这就是IP地址定义的事了。
IP 地址
用 32位
来表示,通常被分割为 4个8位
。以 点分十进制
表示成 [a.b.c.d]
的形式。同时这32bit又被划分为 网络号和主机号
组成。比如 10.100.122.2/24
这个IP: 10.100.122.2
是 点分十进制
表示形式,/24
表示的是 前24位是网络号,后8位是主机号
。这个网络号其实充当的就是 国家城市区 的概念。比如我们只需要记住怎么去往 10.100.122.x
,就知道怎么去找 10.100.122.1/24 和 10.100.122.2/24 了。为了方便获取网络号 ,又出现一个 子网掩码
的概念。子网掩码就是网络号位上全为1,主机号全为0的IP地址
。这样当 IP&子网掩码
得到的就是 IP的网络号
。所以 10.100.122.2/24 的子网掩码就是 255.255.255.0。
即:
子网掩码 = 网络号全是1,主机号全是0
IP网络号 = IP地址 & 子网掩码
好了,我们来看一下IPv4对IP地址的划分:
其中A/B/C类可用于表示公网IP。D类用于多播组号,使用这一类地址,属于某个组(相同网络号的)的机器都能收到,E类还留待使用。但是我们并不用记住公网IP是属于A/B/C类中哪一类,我们只需要 用/24或/16
这样的CIDR方式去 区分IP的网络号和主机号就可以
。
实际上,A/B/C类划分的IP显然是不够用每个地球人用的,我们日常在接入公网时,都需要走能有 公网IP的网关
。在整个公网内部,再分配私有IP地址
给每个人上网使用就可以了。比如家庭常用的192.168.0.x/24 私有IP网段。
此外,在这五类IP地址基础上还划分出了特殊的IP网段。
- IP路由
IP的目的就是将路由简单化,IP的网络号承担了 一组IP 的路由
出入口的作用。实际上 网关
就是这个出入口。不同局域网(IP网络号不同)的网络通信必须经过网关,相同局域网的网络通信可以靠广播和MAC地址来送达目标机器。
假使我们从 203.16.20.5/24 —> 203.16.24.4/24
发一个包,其中源IP和目标IP都是公网IP。那包的路由过程如下:
源机器网络程序在封装数据包的过程中发现目标机器和自己的IP不在同一局域网内,则需要通过 网关
将包从 网卡
发出去。1处
的数据包结构为:
到了网关1,拆包发现目标IP地址是 203.16.24.4/24。查了下自己的路由表,发现要想访问 203.16.24.4/24,要从 203.16.22.2/24 这个口出去,下一跳为 203.16.22.4/24。此时2处的数据包结构为:
到了网关2,拆包发现目标IP地址是 203.16.24.4/24。查了下自己的路由表,发现要想访问 203.16.24.4/24,要从 203.16.24.1/24 这个口出去。此时3处的数据包结构为:
到了目标机器,拆包发现目标IP地址就是自己呀,所以进行更上层的拆包,把数据收进来就可以了。
我们可以发现这种方式的 路由每经过一次局域网,MAC地址需要改变
,但IP地址不需要改变。这种 网关称为转发网关
。而实际上还存在一种改变 IP 地址的网关,称为 NAT 网关
。我们就不展开了,小伙伴可以自行搜索。
现在我们知道 IP/MAC地址/网关
等怎么解决上述两个 发给谁
和 通过怎么样的路线才能发给目标机器
的问题了
TCP & UDP(传输层协议)
TCP
和 UDP
是 传输层的协议
,比作:卡车。
TCP(传输控制协议
,Transmission Control Protocol)
TCP
是 面向连接的、可靠的、基于字节流的传输层控制协议,需要建立连接和断开连接,即三次握手和四次挥手
,TCP
提供 超时重发、丢弃重复数据、检验数据、流量控制
等功能
- TCP三次握手过程
为什么是三次握手,而不是二次握手?(三次握手是为了建立一个
可靠的数据传输通道
)刚开始
客户端
处于关闭状态,而且服务端
一直处于监听状态,时刻监听是否有建立连接的请求当客户端需要建立连接的时候就会发送一个
请求连接
的报文,此报文是同步报文SYN=1
,并且会生成一个随机的序号seq=x
,这是第一次握手
当服务端接收到请求连接报文时,会发送一个
确认连接
的报文,此报文是同步报文SYN=1
,并且确认报文ACK=1
,同时服务端也会生成一个随机的序号seq=y
,并且将确认报文确认号ack=x+1
,回传给客户端,这是第二次握手
当客户端接收到服务端的
ACK确认报文后
,会回复一个ACK确认报文
,用于确认确认报文已经收到,此报文ACK=1,seq=x+1,ack=y+1
,这是第三次握手
- 四次挥手
四次挥手则是为了保证数据传输完成接收再关闭连接
客户端断开连接时会发送一个
请求断开连接
的报文,此报文是FIN=1
,并且会生成一个随机的序号seq=u
,发送给服务端,这是第一次挥手
服务端接收到请求断开连接
FIN报文
后,回复一个确认断开连接
报文ACK=1,seq=v,ack=u+1
,这是第二次挥手
当
服务端数据发送完后
,再发送一个准备关闭连接
的FIN
报文给客户端,通知客户端,服务端准备关闭连接,此报文FIN=1,ACK=1,ack=u+1,seq=w
,这是第三次挥手
当客户端收到准备关闭连接
FIN报文
,再发送一个关闭连接FIN
报文ACK=1,seq=u+1,ack=w+1
,并进入TIME-WAIT
等待,等待2MSL
后关闭连接,这是第四次挥手
UDP(用户数据报协议,User Data Protocol)
UDP
是 面向非连接的、不可靠的传输层协议
,不需要建立连接,没有超时重发等功能
TCP 和 UDP 的区别 重点面试题
TCP 需要建立连接和断开连接。UDP 不需要
TCP 数据传输慢。UDP 数据传输快
TCP 传输可靠。UDP 传输不可靠
TCP 传输有序。UDP 传输无序
TCP 基于字节流。UDP 基于数据报
TCP 有超时重发等功能。UDP 没有超时重发等功能
HTTP(应用层协议)
- HTTP是什么?
HTTP的全称是
Hypertext Transfer Protocol
,超文本传输协议
,是互联网上应用最广泛的一种网络协议。应用层的协议
,比作:货物是建立在
TCP
协议之上的一种应用。最显著的特点是客户端发送的每次请求都需要服务端响应
。端口号 80
- 作用:
- 规定客户端和服务端的数据传输格式
- 让客户端和服务器进行有效的数据沟通
- 为什么选HTTP?
简单快速
:因为HTTP协议简单,所有的HTTP服务器的程序规模小,因而通信速度很快灵活
:HTTP允许传输任意类型的数据持续链接
:限制每次链接只处理一个请求,服务器对客户端的请求作出响应后,马上断开链接,这种方式可以节省传输时间
- 通信过程
- 请求:客户端向服务器索要数据
- 请求行:包含了
请求方法,请求资源路径,HTTP协议版本
1 | GET // 请求方法 |
- 请求头:包含了对
客户端的描述
,客服端请求的主机地址等信息
1 | Host:192.168.1.105:80 // 客户端想访问的服务器 主机地址/域名/端口号 |
- 请求体:客户端发给服务器的
具体数据
,比如文件数据
- 响应:服务器返回客户端响应的数据
- 状态行:包含了
HTTP协议版本,状态码,状态英文名称
:
HTTP/1.1 200 OK
常用的响应状态码:
- 响应头:包含了对
服务器的描述
,对返回数据的描述
1 | Server: Apache-Coyote/1.1 // 服务器的类型 |
- 实体内容:服务器返回给客户端的
具体数据
,比如文件数据
- 发送请求的方法:
- 简单说明 : 在HTTP/1.1协议中,定义了8种发送http请求的方法
Get,Post,Put,Delete,Patch,Trace,Connect,Options,Head
get和post请求 ,要想使用Get和Post请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的账号,密码 ,Get和Post对比:
- Get :在请求URL后面以
?
的形式跟上发给服务器的参数,多个参数之间用&
隔开。 注意:由于客户端和服务器对URL长度有限,因此在URL后面附带的参数是有限制
的,通常不能超过1KB - Post :发给服务器的
参数全部放在请求体
中,理论上,Post传递的参数没有限制
(具体还得看服务器的处理能力)
- Get :在请求URL后面以
Get和Post的选择的建议
- 如果要传递大量数据,比如文件上传,只能用Post请求
- Get的安全性比Post要差些,如果包含机密/敏感信息,建议用Post
- 如果仅仅要索取数据(数据查询),建议使用Get
- 如果是增加,修改,删除数据,建议使用Post
- HTTP版本历史
6.1 HTTP/1.0
默认是:
短连接
,一次请求-响应,建立一次连接,用完了关闭,每次请求都需要建立一次TCP连接,网络利用率低
长连接:想要
建立长连接
,则使用keep-alive
参数,建立一个连接,所有请求串行起来,客户端收到前一个请求的服务端响应后,后一个请求才能发出(可能造成对头阻塞head of line blocking
)HTTP1.0
不支持断点续传功能
,每次都会传送全部的页面和数据。如果只需要部分数据就会浪费多余带宽
6.2 HTTP/1.1
默认是:
长连接,一个连接处理多个请求
。为了解决早期HTTP/1.0
每次都要建立连接导致通信效率低
的性能问题,因为HTTP/1.1
基于TCP/IP
协议,为了解决上述TCP
连接问题,HTTP/1.1
提出了长连接
的通信方式,也叫持久连接
。这种方式的好处在于减少了TCP
连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持
TCP
连接状态。如果某个HTTP
长连接超过一定时间没有任何数据交互,服务端就会主动断开这个连接。
管道传输
因为
HTTP/1.1
采用了长连接
的方式,这使得管道(Pipelining)
网络传输成为了可能。管道(Pipelining):即可在同一个
TCP
连接里面,客户端可以发起多个请求
,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应。
如果服务端在处理
A
请求时耗时比较长,那么后续的请求的处理都会被阻塞住,这称为对头阻塞(head of line blocking)
。
什么是对头阻塞
对头阻塞(head of line blocking),由于HTTP1.0规定下一个请求必须在前一个请求响应到达之前才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。
HTTP/1.1 管道解决了
请求
的队头阻塞,但是没有解决响应
的队头阻塞。
keep-alive 怎么断开连接?
通过在服务器配置文件中设置
Keep-Alive超时时间
来完成(超时,则服务器自动关闭连接
)你可以发送一个HTTP请求头部中包含
“Connection:close”
的请求(这将告诉服务器,在发送响应之后关闭连接,而不是保持链接打开以等待其他请求)
HTTP/1.0 和 HTTP/1.1 区别
HTTP/1.0
发完一个请求后立马结束tcp链接,接着在发起第二个,属于一种串行短连接
的方式HTTP/1.1
可以只用一个tcp长链接发起请求
,这样可以较少tcp链接的开销,同时也可以开启管道机制
,并行的发送多个请求,但必须要按顺序返回
。HTTP/1.1
有keep-Alive
功能,即长链接
HTTP/1.1
有管道机制(pipeline)
,即并行发起请求
6.2 HTTP/2.0
HTTP/2.0
协议是基于 HTTPS
的,更加安全,HTTP/2.0
增加如下几点的重大优化:
头部压缩
HTTP2.0
会压缩Header
部分;如果同时多个请求其头部一样或相似,那么协议会消除重复部分。利用
HPAK
算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,就不用重复发送同样字段了,只发送索引号,减少数据量提高速度
二进制分帧
HTTP/1.0
和HTTP/1.1
中,报文都是纯文本的格式
简单易读;而在HTTP/2.0
中采用了二进制的格式
报头和数据体 称为:帧(frame)-> 头信息帧(Headers Frame)和数据帧(Data Frame)
数据以
数据流(stream)
的形式以字节
单位发送,数据包可以不按顺序发送在
HTTP/2.0
中每个请求或响应
的所有数据包,称为一个数据流(Stream)
。每个数据流都标记着一个独一无二的编号(Stream ID)
;所有
HTTP2.0
通信都在一个TCP
链接上完成,这个链接可以承载任意流量的双向数据流
。每个数据流以消息
的形式发送,而消息由一或多个帧
组成。不同Stream
的帧是可以乱序发送的(因此可以并发不同的Stream
),因为每个帧的头部会携带Stream ID
信息,所以接收端可以通过Stream ID
有序组装成HTTP
消息客户端还可以
指定数据流的优先级
。优先级高的请求,服务器就先响应该请求
多路复用
HTTP2.0
实现了真正的并行传输
,它能够在一个TCP
上进行任意数量的HTTP请求,由于其二进制分帧
特性HTTP/2.0
是可以在一个连接中并发多个请求或回应
,而不用按照顺序一一对应。移除
了HTTP/1.1
中的串行请求
,不需要排队等待,彻底解决队头阻塞问题
,降低了延迟,大幅度提高了连接的利用率。
服务端推送
HTTP/2.0
还在一定程度上改善了传统的请求 - 应答
工作模式,服务端不再是被动地响应,可以主动向客户端发送消息、推送额外的资源。
TCP导致队头阻塞
因为
TCP
面向字节流
传输,而且保证传输可靠性和数据的完整性只有
TCP
拿到完整连续的数据时,内核才会将数据从缓冲区交给HTTP
应用,而只要前一个字节没有收到,HTTP就无法从内核缓冲区中得到数据,直到其到达,所以在此过程仍然会导致队头阻塞
HTTP/1.0和HTTP/2.0的区别?
HTTP/2.0
传输效率上大大提升,主要得益于 采用二进制分帧
的方式,可以真正做到 多路复用
,并且 可以对首部进行压缩和使用字典较少传输的字符数
。
多路复用
,真正做到一个tcp
链接可以并行
的发送请求,相对HTTP/1.1
的长链接和管道机制优化返回必须按顺序的缺点二进制分帧
首部压缩
服务器推送
请求优先级控制
6.3 HTTP/3.0
为了解决
HTTP/2.0
中TCP
造成的队头阻塞问题
,HTTP/3.0
直接放弃使用TCP
,将传输层协议改成UDP
;但是因为UDP
是不可靠传输,所以这就需要QUIC
实现可靠机制QUIC
也是需要三次握手
来建立连接的,主要目的是为了确定连接 ID
。
无队头阻塞
QUIC
协议也有类似HTTP/2.0 Stream
与多路复用
的概念,也是可以在同一条连接上并发传输
多个Stream
,Stream
可以认为就是一条HTTP
请求。QUIC
有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。这与HTTP/2.0
不同,HTTP/2.0
只要某个流中的数据包丢失了,其他流也会因此受影响。所以,
QUIC
连接上的多个Stream
之间并没有依赖,都是独立的,某个流发生丢包了,只会影响该流,其他流不受影响。
连接建立
HTTP/3.0
在传输数据前虽然需要QUIC
协议握手,这个握手过程只需要1 RTT
,握手的目的是为确认双方的连接 ID
,连接迁移
就是基于连接 ID
实现的。
连接迁移
基于
TCP
传输协议的HTTP
协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)
确定一条TCP
连接,例如设备要连接wifi(IP地址改变)就必须要重新建立连接,而建立连接包含TCP三次握手和TSL四次握手
,以及TCP慢启动所以会造成使用者卡顿的感觉而
QUIC
通过连接ID
标记自己,客户端和服务器可以各自选择一组ID
来标记自己,因此即使移动设备的网络变化后,导致IP
地址变化了,只要有上下文信息(比如连接 ID
、TLS 密钥
等),就可以无缝
地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移
的功能。其实,
QUIC
是一个在UDP
之上的伪TCP + TLS + HTTP/2.0
的多路复用的协议。
HTTP/2.0和HTTP/3.0的区别
HTTP/2.0
效率已经很高了,但还是存在三个问题,其一是 tcp
和 ssl
链接太费时间,其二是 tcp
有 队头阻塞
的问题,其三是 网路切换
问题。HTTP/3.0
就是为了解决上面这些问题而产生的。
- 采用
udp
协议,提高握手效率 0或1 RTT 建立链接
,QUIC
协议包含了TLS1.3
不再分层,可以进一步优化握手过程,首次链接只需要1RTT
,而非首次链接更能做到0RTT
建立链接,主要是把应用数据和秘钥协商的过程进行了统一- 可以
无缝迁移网路
,使用链接ID
来标识,与ip无关
HTTPS(应用层协议)
- HTTPS 是什么?
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer)
超文本传输安全协议
。是应用层的协议,在
HTTP
基础上引入一个加密层
,使用SSL/TLS
加密数据包保护数据的隐私和完整性
默认是建立在
TCP
协议之上的一种应用端口号
443
- 组成:HTTPS协议 = HTTP协议 + SSL/TLS协议
SSL:全称是 Secure Sockets Layer,即
安全套接层协议
TLS:全称 Transport Layer Security,即
安全传输层协议
- 加密是什么?
加密相关术语:
- 明文:传输的原始数据
- 密文:通过一定的规则将明文变换后的数据
- 加密:将明文变成密文
- 解密:将密文变成明文
- 密钥:在加密和解密的过程中,往往需要一个或多个中间的数据来辅助该过程,这样的数据称为密钥
为什么需要 HTTPS,为什么需要加密?
- 防止传输的数据被
运营商/黑客等
篡改。 HTTPS
密文传输保证了用户信息的安全。
- 防止传输的数据被
- 加密方式
为了保证数据的安全,就需要进行 加密
,即网络传输中不再使用 明文
,而是 加密
后的 密文
。加密的方式有很多种,整体分为两大类:对称加密
和 非对称加密
对称加密:
加密和解密
都会用到同一个密钥
。常见的对称加密算法
有DES、AES、3DES、Blowfish、IDEA、RC5、RC6
。非对称加密:使用
一对非对称的密钥
,一把叫做私有密钥
,另一把叫做公有密钥
;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法
。
HTTPS 工作过程:
HTTPS
为了兼顾安全与效率
,同时使用了对称加密 + 非对称加密 + 消息摘要算法
。SSL/TLS = 对称加密(DES AES) + 非对称加密(RSA) + 消息摘要算法(MD5 SHA)
- 引入对称加密
对称加密
只通过一个 秘钥
,把明文加密成密文,并且也能把密文解密成明文。
只引入对称秘钥存在的问题:
通过对称秘钥加密,貌似就可以进行数据的保护了。黑客就算入侵了路由器,也只能得到请求的密文内容
但是上述方案有一个问题,就是密钥如何进行约定?毕竟一个服务器对应着很多的客户端,每个客户端和服务器之间都需要约定一个独自的密钥。
可如果让服务器管理所有的密钥,其实并不简单,因此更好的做法就是客户端连接过来时,就自带一个客户端生成好的密钥。当每个客户端在连接之前,自己先生成一个密钥,通过网络将该信息告诉服务器,服务器将这个密钥保存即可。
也正是因为如此,黑客在获取密文请求的同时,也获取到了密钥,因此只使用对称加密并不能起到数据保护的作用。所以还需要让密钥进行加密,但是使用对称加密的话,是行不通的,故引入了 非对称加密
- 非对称加密
非对称加密
要 额外
再用到两个密钥,一个叫做 公钥
,一个叫做 私钥
。公钥和私钥是成对的,这对密钥由服务器产生。
缺点:
运算速度非常慢,比对称加密慢很多
引入流程:
服务器将公钥直接发送给客户端,将私钥保留。客户端得到公钥后,通过公钥将密钥进行加密,再发送给服务器,服务器通过私钥解密获取到密钥。之后再将收到密钥的消息通过密钥加密后发送给客户端,客户端收到后,就使用该密钥通过对称加密的方式与客户端进行数据传输
引入非对称加密后,为什么还要使用对称加密?
由于对称加密的成本(对机器资源的消耗)远远低于非对称加密,而实际上客户端和服务器之间传输的数据量会很大,如果都使用非对称加密,整体的传输速度就会很慢,因此通过非对称加密,让服务器得到密钥后,再使用对称加密进行传输,能够提高传输的效率
引入非对称加密后还存在的问题?
服务器首先生成一对公钥A和私钥A。首先服务器要把公钥A发送给客户端,此时黑客可以当作一个中间人,自己生成一对公钥B和私钥B。他会将服务器的信息阶段,并将自己生成的公钥B发送给客户端。当客户端得到公钥B后,就使用公钥B加密自己生成的密钥A并发送给服务器。此时黑客再次截取,通过私钥B解密公钥B,得到密钥A,并使用公钥A将密钥进行加密返回给服务器。至此服务器和客户端都确定了密钥A,但黑客也神不知鬼不觉的知道了密钥A。故在之后的数据传输中,黑客就可以直接完全的获取客户端和服务器的明文数据。因此即使引入了非对称机密还是存在两个问题:
1)客户端如何获取到公钥?
2)客户端如何确定这个公钥不是黑客伪造的?
为了解决这两个问题,就引入了 证书
- 引入证书机制
- 基本介绍
在客户端和服务器刚建立连接时,服务器就给客户端返回一个 证书
。这个证书就好比人的身份证,用来作为网站的身份标识。而每搭建一个 HTTPS
网址时都需要在 CA
机构申请一个证书。
证书含有的重要信息:
- 证书发布机构
- 证书有效期
- 公钥
- 证书所有者
- 签名
引入证书流程:
服务器首先产生一对 公钥和私钥
,在第三方公证机构申请一个证书时,该证书内就包含了公钥的信息,然后服务器就会将 证书
发送给客户端,由于证书的校验很严格,因此黑客就算获取了,也很难伪造一个假的证书。即使伪造了,客户端也可以拿到第三方公证机构去校验,因此客户端就能够拿到服务器发送的公钥,之后再通过公钥加密自己产生的密钥,发送给服务器。由于黑客没有私钥,就算截获了该请求,也不能拿到密钥,因此服务器就能顺利的得到加密的密钥,并使用私钥来解密。最终就能够很好的防止黑客获取或篡改数据。
校验证书方式:
- 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任
- 判定证书是否被篡改(从系统中拿到该证书发布机构的公钥,对签名解密,得到一个
hash
值(称为数据摘要),设为hash1
。然后计算整个证书的hash
值,设为hash2
。对比hash1
和hash2
是否相等,如果相等,则说明证书是没有被篡改过的)
证书机制
- 服务器首先把自己的
公钥、网址等信息
发给证书颁发机构,向证书颁发机构申请证书。 - 证书颁发机构自己也有一对公钥私钥,
机构
利用自己的私钥
对服务器的公钥、网址等信息
进行签名加密
,生成一个证书
。 - 机构把证书发送给服务端,服务端把证书发送给客户端
- 客户端到指定的机构验证证书,根据
机构公钥去解密
,得到服务器的公钥
。
- 服务器首先把自己的
理解数据值摘要和签名:
针对一段数据,可以通过一些特定的算法对这个数据生成一个签名。由于不同的数据生成的签名差别很大,因此就可以使用签名在一定程度上区分不同的数据。常见的生成签名的算法有:MD5
和 SHA
,以下以 MD5
为例,介绍其特点
- 定长:无论多长的字符串,计算出来的 MD5 值都是固定长度(16字节版本或者32字节版本)
- 分散:源字符串只要改变一点点,最终得到的 MD5 值都会差别很大
- 不可逆:通过源字符串生成 MD5 很容易,但是通过 MD5 还原成原串理论上是不可能的
- 由于 MD5 这样的特性,因此可以认为如果两段数据的 MD5 值相同,则这两段数据相同
- 完整流程
对称加密
:需要有一个客户端生成的对称密钥,用于对传输的数据进行加密,但需要将该对称密钥告知给服务器非对称加密
: 服务器提供一个公钥(自己持有私钥),将公钥传发送给客户端,客户端使用公钥对对称密钥进行加密,将密文传送给服务器引入证书机制
: 通过第三方公证机构,向网站颁发证书,该证书里面就含有公钥。客户端向服务器请求的也就是证书,客户端拿到证书后去公证机构校验,如果证书合法,就使用里面的公钥对对称密钥进行加密
HTTPS连接过程
【第一步】
客户端访问HTTPS连接
【第二步】
服务端发送证书给客户端
,证书是从第三方机构获取【第三步】
客户端验证服务端证书
,从里面将公钥
拿出来【第四步】
客户端用公钥加密对称秘钥
,将密文发送给服务端【第五步】
服务端通过私钥解密得到对称秘钥
【第六步】这个时候就可以通过 对称秘钥加密数据进行传输数据了
HTTPS和HTTP的区别? 重点
HTTP:超文本传输协议,信息明文传输;端口号80;响应速度快;
HTTPS:超文本传输安全协议,等价于HTTP协议 + SSL/TLS协议;端口号443;响应速度慢;
为什么客户端在四次挥手后还等待2MSL? 重点
MSL:一段TCP报文在传输过程中最大生命周期
因为客户端发出最后的ACK确认报文时,并不能确定服务器能接收到该报文,所以客户端发送完ACK报文后,需要设置一个时长为2MSL计时器,2MSL是服务端发出FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长
。
Socket 重要
- 什么是socket?
Socket
俗称套接字
,是网络通信的基本操作单元
。它可以通过IP地址、端口号、TCP/UDP协议
实现客户端和服务端的双向通信。不属于协议范畴,而是一个接口(API),是对
TCP/IP协议
的封装可以基于TCP连接,也可以基于UDP连接
基于TCP连接,需要三次握手,是可靠的
基于UDP连接,不需要握手,是不可靠的,大多数IM都是不可靠的
- 长链接 和 短链接
长链接:连上就一直聊,通常用于
及时通讯
,效率高。(一对一)短链接:通讯一次,马上断开,下次再建立连接,效率低。(一对多)
及时通讯:客户端和服务端是 短链接
,客户端与客户端是 长链接
- iOS端实现 Socket
用 GCDAsyncSocket
框架
WebSocket
- 什么是WebSocket?
WebSocket
是 HTML5
中新协议、新API,同HTTP一样是 应用层的协议
。
- 特点
WebSocket
是建立在TCP
之上WebSocket
是一种双向通信协议
WebSocket
是全双工通信
,服务器和客户端能主动向对方发送或接收数据。
注:什么是单工、半双工、全工通信?
数据只能单向传送为单工
数据能双向传送但不能同时双向传送称为半双工
数据能够同时双向传送则称为全双工
WebService
- 什么是WebService?
- 基于web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
- 一个夸语言、跨平台的规范(抽象)
- 多个跨平台、跨语言的应用间通信整合的方案(实际)
- 为什么要用WebService?
WebService
能解决 跨平台、跨语言、远程调用
- 什么时候使用WebService
- 同一家公司的新旧应用之间
- 不同公司应用之间
- 一些提供数据的内容聚合应用:天气预报、股票行情
TCP/IP
一、计算机网络体系结构分层:
不难看出,TCP/IP
与 OSI
在分层模块上稍有区别。OSI
参考模型注重 通信协议必要的功能是什么 ,而 TCP/IP
则更强调 在计算机上实现协议应该开发哪种程序
。
二、 TCP/IP 基础
- TCP/IP 的具体含义
从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。
互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。
- 数据包
包、帧、数据包、段、消息
以
上五个术语都用来表述数据的单位,大致区分如下:
包
可以说是全能性术语;帧
用于表示数据链路层中包的单位;数据包
是IP
和UDP
等网络层以上的分层中包的单位;段
则表示TCP
数据流中的信息;消息
是指应用协议中数据的单位。
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。包首部就像协议的脸。
- 数据处理流程
下图以用户 a 向用户 b 发送邮件为例子:
① 应用程序处理
首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;
编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。
② TCP 模块的处理
TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。
③ IP 模块的处理
IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
④ 网络接口(以太网驱动)的处理
从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
⑤ 网络接口(以太网驱动)的处理
主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。
如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
⑥ IP 模块的处理
IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
另外吗,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。
⑦ TCP 模块的处理
在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
⑧ 应用程序的处理
接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。
三、传输层中的 TCP 和 UDP
TCP/IP
中有两个具有代表性的传输层协议,分别是 TCP
和 UDP
。
TCP
是面向连接的、可靠的流协议
。流就是指不间断的数据结构,当应用程序采用TCP
发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP
为提供可靠性传输,实行顺序控制
或重发控制
机制。此外还具备流控制(流量控制) 、 拥塞控制 、提高网络利用率等
众多功能。UDP
是不具有可靠性的数据报协议
。细微的处理它会交给上层的应用去完成。在UDP
的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。TCP
和UDP
的优缺点无法简单地、绝对地去做比较:TCP
用于在传输层有必要实现可靠传输的情况;而在一方面,UDP
主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP
和UDP
应该根据应用的目的按需使用。
- 端口号
数据链路
和 IP
中的地址,分别指的是 MAC地址
和 IP地址
。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP
网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是 端口号
。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为 程序地址
。
1.1 根据端口号识别应用
一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。
1.2 通过 IP 地址、端口号、协议号进行通信识别
仅凭目标端口号识别某一个通信是远远不够的。
① 和 ② 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分。
③ 和 ① 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同。
此外,当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)。
1.3 端口号的确定
标准既定的端口号:这种方法也叫
静态方法
。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如HTTP、FTP、TELNET
等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在0~1023
之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在1024~49151
之间,不过这些端口号可用于任何通信用途。时序分配法:服务器有必要确定
监听端口号
,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在49152~65535
之间。
1.4 端口号与协议
端口号
由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。此外,那些知名端口号与传输层协议并无关系。只要端口一致都将分配同一种应用程序进行处理。
- UDP
UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
此外,传输途中出现丢包,UDP 也不负责重发。
甚至当包的到达顺序出现乱序时也没有纠正的功能。
如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。
UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。
- TCP
TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。
此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。
3.1 三次握手(重点)
TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
下面来看看三次握手的流程图:
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入
SYN_RCVD
状态。第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
3.2 四次挥手(重点)
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
下面来看看四次挥手的流程图:
中断连接端可以是客户端,也可以是服务器端。
第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,
具体流程如下图:
3.3 通过序列号与确认应答提高可靠性
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。
在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。
对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此我们引入了序列号。
序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。
3.4 重发超时的确定
重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。最理想的是,找到一个最小时间,它能保证“确认应答一定能在这个时间内返回”。
TCP 要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值。
在 BSD 的 Unix 以及 Windows 系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。不过,最初其重发超时的默认值一般设置为6秒左右。
数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。
此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。
3.5 以段为单位发送数据
在建立 TCP 连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。最理想的情况是,最大消息长度正好是 IP 中不会被分片处理的最大数据长度。
TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送。进行重发时也是以 MSS 为单位。
MSS 在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小。然后会在两者之间选择一个较小的值投入使用。
3.6 利用窗口控制提高速度
TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。
为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:
- 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。
3.7 滑动窗口控制
上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。
在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制。
3.8 窗口控制中的重发控制
在使用窗口控制中, 出现丢包一般分为两种情况:
① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:
② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。
四、网络层中的 IP 协议
IP(IPv4、IPv6)
相当于OSI
参考模型中的第3层——网络层。网络层的主要作用是实现终端节点之间的通信
。这种终端节点之间的通信也叫点对点通信
。网络的下一层 ——
数据链路层
的主要作用是在互连同一种数据链路的节点之间进行包传递
。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。IP 大致分为三大作用模块,它们是
IP 寻址、路由(最终节点为止的转发)以及 IP 分包与组包
。
- IP 地址
1.1 IP 地址概述
在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。在数据链路中的 MAC 地址正是用来标识同一个链路中不同计算机的一种识别码。
作为网络层的
IP
,也有这种地址信息,一般叫做IP
地址。IP 地址
用于在连接到网络中的所有主机中识别出进行通信的目标地址
。因此,在TCP/IP
通信中所有主机或路由器必须设定自己的IP 地址
。不论一台主机与哪种数据链路连接,其 IP 地址的形式都保持不变。
IP 地址(IPv4 地址)由32位正整数来表示。IP 地址在计算机内部以二进制方式被处理。然而,由于我们并不习惯于采用二进制方式,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数。如下:
2828282810101100000101000000000100000001(2进制)10101100.00010100.00000001.00000001(2进制)172.20.1.1(10进制)
1.2 IP 地址由网络和主机两部分标识组成
- 如下图,网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP 地址的“主机标识”则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的 IP 地址都不会相互重叠。即 IP 地址具有了唯一性。
- 如下图,IP 包被转发到途中某个路由器时,正是利用目标 IP 地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。
1.3 IP 地址的分类
IP 地址分为四个级别,分别为
A类、B类、C类、D类
。它根据IP
地址中从第1
位到第4
位的比特列对其网络标识和主机标识进行区分。A 类 IP
地址是首位以0
开头的地址。从第 1 位到第 8 位是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0
是A 类的网络地址
。A 类地址的后 24 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。B 类 IP
地址是前两位10
的地址。从第 1 位到第 16 位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0
是 B 类的网络地址。B 类地址的后16
位相当于主机标识。因此,一个网段内可容纳的主机地址上限为65,534个。C 类 IP
地址是前三位为110
的地址。从第 1 位到第 24 位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0
是 C 类的网络地址。C 类地址的后 8 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为254个。D 类 IP
地址是前四位为1110
的地址。从第 1 位到第 32 位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255
是 D 类的网络地址。D 类地址没有主机标识,常用于多播。在分配 IP 地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为 0 或全部为 1。因为全部为 0 只有在表示对应的网络地址或 IP 地址不可以获知的情况下才使用。而全部为 1 的主机通常作为广播地址。因此,在分配过程中,应该去掉这两种情况。这也是为什么 C 类地址每个网段最多只能有 254( 28 - 2 = 254)个主机地址的原因。
1.4 广播地址
广播地址用于在同一个链路中相互连接的主机之间发送数据包。将 IP 地址中的主机地址部分全部设置为 1,就成了广播地址。
广播分为本地广播和直接广播两种。在本网络内的广播叫做本地广播;在不同网络之间的广播叫做直接广播。
1.5 IP 多播
多播用于将包发送给特定组内的所有主机。由于其直接使用 IP 地址,因此也不存在可靠传输。
相比于广播,多播既可以穿透路由器,又可以实现只给那些必要的组发送数据包。请看下图:
多播使用 D 类地址。因此,如果从首位开始到第 4 位是 “1110”,就可以认为是多播地址。而剩下的 28 位可以成为多播的组编号。
此外, 对于多播,所有的主机(路由器以外的主机和终端主机)必须属于 224.0.0.1 的组,所有的路由器必须属于 224.0.0.2 的组。
1.6 子网掩码
现在一个
IP 地址
的网络标识
和主机标识
已不再受限于该地址的类别,而是由一个叫做子网掩码
的识别码通过子网网络地址细分出比 A 类、B 类、C 类更小粒度的网络。这种方式实际上就是将原来 A 类、B 类、C 类等分类中的主机地址部分用作子网地址
,可以将原网络分为多个物理网络的一种机制。子网掩码
用二进制方式表示的话,也是一个 32 位的数字。它对应 IP 地址网络标识部分的位全部为 “1”,对应 IP 地址主机标识的部分则全部为 “0”。由此,一个 IP 地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是 IP 地址的首位开始连续的 “1”。对于子网掩码,目前有两种表示方式。第一种是,将
IP 地址
与子网掩码
的地址分别用两行来表示。以172.20.100.52
的前 26 位
是网络地址
的情况为例,如下:
IP 地址 172.20.100.52 子网掩码 255.255.255.192
网络地址 172.20.100.0 子网掩码 255.255.255.192
广播地址 172.20.100.63 子网掩码 255.255.255.192
- 第二种表示方式是,在每个 IP 地址后面追加网络地址的位数用 “/ ” 隔开,如下:
IP 地址 172.20.100.52/26
网络地址 172.20.100.0/26
广播地址 172.20.100.63/26
另外,在第二种方式下记述网络地址时可以省略后面的 “0” 。例如:172.20.0.0/26 跟 172.20/26 其实是一个意思。
- 路由
发送数据包时所使用的地址是网络层的地址,即
IP 地址
。然而仅仅有 IP 地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于指明路由器或主机
的信息,以便真正发往目标地址。保存这种信息的就是路由控制表。该路由控制表的形成方式有两种:
一种是管理员手动设置,另一种是路由器与其他路由器相互交换信息时自动刷新
。前者也叫做静态路由控制
,而后者叫做动态路由控制
。IP 协议始终认为路由表是正确的。然后,IP 本身并没有定义制作路由控制表的协议。即 IP 没有制作路由控制表的机制。该表示由一个叫做“路由协议”的协议制作而成。
2.1 IP 地址与路由控制
IP 地址的网络地址部分用于进行路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。
- IP 分包与组包
每种数据链路的最大传输单元(MTU)都不尽相同,因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
任何一台主机都有必要对 IP 分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。
3.1 路径 MTU 发现
分片机制也有它的不足。如路由器的处理负荷加重之类。因此,只要允许,是不希望由路由器进行 IP 数据包的分片处理的。
为了应对分片机制的不足,“路径 MTU 发现” 技术应运而生。路径 MTU 指的是,从发送端主机到接收端主机之间不需要分片是最大 MTU 的大小。即路径中存在的所有数据链路中最小的 MTU 。
进行路径 MTU 发现,就可以避免在中途的路由器上进行分片处理,也可以在 TCP 中发送更大的包。
- IPv6
- IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。
4.1 IPv6 的特点
IP 得知的扩大与路由控制表的聚合。
性能提升。包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负担。路由器不再做分片处理。
支持即插即用功能。即使没有DHCP服务器也可以实现自动分配 IP 地址。
采用认证与加密功能。应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
多播、Mobile IP 成为扩展功能。
4.2 IPv6 中 IP 地址的标记方法
一般人们将 128 比特 IP 地址以每 16 比特为一组,每组用冒号(“:”)隔开进行标记。
而且如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号(“::”)隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。
4.3 IPv6 地址的结构
IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。
在互联网通信中,使用一种全局的单播地址。它是互联网中唯一的一个地址,不需要正式分配 IP 地址。
未定义0000 … 0000(128比特)::/ 128环回地址0000 … 0001(128比特)::1 / 128唯一本地地址1111 110FC00:/ 7链路本地单播地址1111 1110 10FE80::/ 10多播地址1111 1111FF00::/ 8全局单播地址(其他)
4.4 全局单播地址
全局单播地址是指世界上唯一的一个地址。它是互联网通信以及各个域内部通信中最为常用的一个 IPv6 地址。
格式如下图所示,现在 IPv6 的网络中所使用的格式为,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特为网络标识,后 64 比特为主机标识。
4.5 链路本地单播地址
链路本地单播地址是指在同一个数据链路内唯一的地址。它用于不经过路由器,在同一个链路中的通信。通常接口 ID 保存 64 比特版的 MAC 地址。
4.6 唯一本地地址
唯一本地地址是不进行互联网通信时所用的地址。
唯一本地地址虽然不会与互联网连接,但是也会尽可能地随机生成一个唯一的全局 ID。
L 通常被置为 1
全局 ID 的值随机决定
子网 ID 是指该域子网地址
接口 ID 即为接口的 ID
4.7 IPv6 分段处理
IPv6 的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。
IPv6 中最小 MTU 为 1280 字节,因此,在嵌入式系统中对于那些有一定系统资源限制的设备来说,不需要进行“路径 MTU 发现”,而是在发送 IP 包时直接以 1280 字节为单位分片送出。
4.8 IP 首部(暂略)
- IP 协议相关技术
- IP 旨在让最终目标主机收到数据包,但是在这一过程中仅仅有 IP 是无法实现通信的。必须还有能够解析主机名称和 MAC 地址的功能,以及数据包在发送过程中异常情况处理的功能。
5.1 DNS
我们平常在访问某个网站时不适用 IP 地址,而是用一串由罗马字和点号组成的字符串。而一般用户在使用
TCP/IP
进行通信时也不使用 IP 地址。能够这样做是因为有了 DNS (Domain Name System)功能的支持。DNS 可以将那串字符串自动转换为具体的 IP 地址。这种 DNS 不仅适用于 IPv4,还适用于 IPv6。
5.2 ARP
只要确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个 IP 地址所对应的 MAC 地址。
ARP 是一种解决地址问题的协议。以目标 IP 地址为线索,用来定位下一个应该接收数据分包的网络设备对应的 MAC 地址。不过 ARP 只适用于 IPv4,不能用于 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 发送邻居探索消息。
RARP 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议。
5.3 ICMP
ICMP 的主要功能包括,确认 IP 包是否成功送达目标地址,通知在发送过程当中 IP 包被废弃的具体原因,改善网络设置等。
IPv4 中 ICMP 仅作为一个辅助作用支持 IPv4。也就是说,在 IPv4 时期,即使没有 ICMP,仍然可以实现 IP 通信。然而,在 IPv6 中,ICMP 的作用被扩大,如果没有 ICMPv6,IPv6 就无法进行正常通信。
5.4 DHCP
如果逐一为每一台主机设置 IP 地址会是非常繁琐的事情。特别是在移动使用笔记本电脑、只能终端以及平板电脑等设备时,每移动到一个新的地方,都要重新设置 IP 地址。
于是,为了实现
自动设置 IP 地址、统一管理 IP 地址分配
,就产生了DHCP(Dynamic Host Configuration Protocol)协议
。有了 DHCP,计算机只要连接到网络,就可以进行 TCP/IP 通信。也就是说,DHCP 让即插即用变得可能。DHCP 不仅在 IPv4 中,在 IPv6 中也可以使用。
5.5 NAT
NAT(Network Address Translator)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。
除转换 IP 地址外,还出现了可以转换 TCP、UDP 端口号的 NAPT(Network Address Ports Translator)技术,由此可以实现用一个全局 IP 地址与多个主机的通信。
NAT(NAPT)实际上是为正在面临地址枯竭的 IPv4 而开发的技术。不过,在 IPv6 中为了提高网络安全也在使用 NAT,在 IPv4 和 IPv6 之间的相互通信当中常常使用 NAT-PT。
5.6 IP 隧道
如上图的网络环境中,
网络 A
与网络 B
之间无法直接进行通信,为了让它们之间正常通信,这时必须得采用IP 隧道
的功能。IP 隧道
可以将那些从网络 A
发过来的IPv6
的包统合为一个数据,再为之追加一个IPv4
的首部以后转发给网络 C
。一般情况下,紧接着 IP 首部的是
TCP
或UDP
的首部。然而,现在的应用当中IP 首部的后面还是 IP 首部
或者IP 首部的后面是 IPv6 的首部
等情况与日俱增。这种在网络层的首部后面追加网络层首部
的通信方法就叫做IP 隧道
。
- Post title:OC网络学习01:TCP/UDP/HTTP/HTTPS/Socket/WebSocket/WebService探索
- Post author:张建
- Create time:2020-07-09 13:07:02
- Post link:https://redefine.ohevan.com/2020/07/09/OC网络/OC网络学习01:HTTP&HTTPS&Socket&WebSocket&WebService探索/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.