计算机网络
应用层(数据):确定进程之间通信的性质以满足用户需要以及提供网络与用户应用
表示层(数据):主要解决用户信息的语法表示问题,如加密解密
会话层(数据):提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制,如服务器验证用户登录便是由会话层完成的
传输层(段):实现网络不同主机上用户进程之间的数据通信,可靠
与不可靠的传输,传输层的错误检测,流量控制等
网络层(包):提供逻辑地址(IP)、选路,数据从源端到目的端的
传输
数据链路层(帧):将上层数据封装成帧,用MAC地址访问媒介,错误检测与修正
物理层(比特流):设备之间比特流的传输,物理接口,电气特性等
IP 地址编址方案将IP地址空间划分为 A、B、C、D、E 五类,其中 A、B、C 是基本类,D、E 类作为多播和保留使用,为特殊地址。
A 类地址:以 0 开头,第一个字节范围:0~127 。
B 类地址:以 10 开头,第一个字节范围:128~191 。
C 类地址:以 110 开头,第一个字节范围:192~223。
D 类地址:以 1110 开头,第一个字节范围:224~239 。
E 类地址:以 1111 开头,保留地址。
物理地址(MAC 地址),是数据链路层和物理层使用的地址。
IP 地址是网络层和以上各层使用的地址,是一种逻辑地址。
其中 ARP 协议用于 IP 地址与物理地址的对应。
网络层的 ARP 协议完成了 IP 地址与物理地址的映射。
TCP(Transmission Control Protocol),传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
主要特点如下:
FTP :定义了文件传输协议
Telnet :它是一种用于远程登陆
SMTP :定义了简单邮件传送协议
POP3 :它是和 SMTP 对应,POP3 用于接收邮件
HTTP :从 Web 服务器传输超文本到本地浏览器的传送协议。
防止了服务器端的一直等待而浪费资源
服务器端准备为每个请求创建一个链接,并向其发送确认报文,然后等待客户端进行确认后创建。如果此时客户端一直不确认,会造成 SYN 攻击,即SYN 攻击,英文为 SYN Flood ,是一种典型的 DoS/DDoS 攻击。
TCP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP 是全双工模式,这就意味着:
TIME_WAIT 表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL后即可回到 CLOSED 可用状态了。如果 FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态。
如果不等,释放的端口可能会重连刚断开的服务器端口,这样依然存活在网络里的老的 TCP 报文可能与新 TCP 连接报文冲突,造成数据冲突,为避免此种情况,需要耐心等待网络老的 TCP 连接的活跃报文全部死翘翘,2MSL 时间可以满足这个需求(尽管非常保守)!
建立连接后,两台主机就可以相互传输数据了。如下图所示:
因为各种原因,TCP 数据包可能存在丢失的情况,TCP 会进行数据重传。如下图所示:
TCP 协议操作是围绕滑动窗口 + 确认机制来进行的。
滑动窗口协议,是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
TCP 的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。
计算机网络中的带宽、交换结点中的缓存及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫做拥塞。
通过拥塞控制来解决。拥堵控制,就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。注意,拥塞控制和流量控制不同,前者是一个 全局性 的过程,而后者指 点对点 通信量的控制。
拥塞控制的方法主要有以下四种:
1)慢开始
不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
2)拥塞避免
拥塞避免算法,让拥塞窗口缓慢增长,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1 ,而不是加倍,这样拥塞窗口按线性规律缓慢增长。
3)快重传
快重传,要求接收方在收到一个 失序的报文段 后就立即发出 重复确认 (为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。
快重传算法规定,发送方只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
4)快恢复
快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。
UDP(User Data Protocol,用户数据报协议),是与 TCP 相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。
主要特点如下:
DNS :用于域名解析服务
SNMP :简单网络管理协议
TFTP:简单文件传输协议
TCP 只支持点对点通信;UDP 支持一对一、一对多、多对一、多对多的通信模式。
TCP 有拥塞控制机制;UDP 没有拥塞控制,适合媒体通信,对实时应用很有用,如 直播,实时视频会议等
既使用 TCP 又使用 UDP 。
HTTP 协议,是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。
主要特点如下:
请求报文包含三部分:
a、请求行:包含请求方法、URI、HTTP版本信息
b、请求首部字段
c、请求内容实体
响应报文包含三部分:
a、状态行:包含HTTP版本、状态码、状态码的原因短语
b、响应首部字段
c、响应内容实体
GET: 对服务器资源的简单请求。
POST: 用于发送包含用户提交数据的请求。
HEAD:类似于 GET 请求,不过返回的响应中没有具体内容,用于获取报头。
PUT:传说中请求文档的一个版本。
DELETE:发出一个删除指定文档的请求。
TRACE:发送一个请求副本,以跟踪其处理进程。
OPTIONS:返回所有可用的方法,检查服务器支持哪些方法。
CONNECT:用于 SSL 隧道的基于代理的请求。
1.明文发送,内容可能被窃听
2.不验证通信方的身份,因此可能遭遇伪装
3.无法证明报文的完整性,可能被篡改
综上所述:
需要 IP 协议来连接网络,TCP 是一种允许我们安全传输数据的机制,使用 TCP 协议来传输数据的 HTTP 是 Web 服务器和客户端使用的特殊协议。HTTP 基于 TCP 协议,所以可以使用 Socket 去建立一个 TCP 连接。
HTTPS ,实际就是在 TCP 层与 HTTP 层之间加入了 SSL/TLS 来为上层的安全保驾护航,主要用到对称加密、非对称加密、证书,等技术进行客户端与服务器的数据加密传输,最终达到保证整个通信的安全性。
端口不同:HTTP 与 HTTPS 使用不同的连接方式,端口不一样,前者是 80,后者是 443。
资源消耗:和 HTTP 通信相比,HTTPS 通信会由于加解密处理消耗更多的 CPU 和内存资源。
开销:HTTPS 通信需要证书,而证书一般需要向认证机构申请免费或者付费购买。
SSL 协议即用到了对称加密也用到了非对称加密
1)客户端发起 https 请求(就是用户在浏览器里输入一个 https 网址,然后连接到 server
的 443 端口)
2)服务端的配置(采用 https 协议的服务器必须要有一套数字证书,可以自己制作,
也可以向组织申请,这套证书就是一对公钥和私钥,这是非对称加密)。
3)传输证书(这个证书就是公钥,只是包含了很多信息)
4)客户端解析证书(由客户端 tls 完成,首先验证公钥是否有效,若发现异常,则弹出
一个警示框,提示证书存在问题,若无问题,则生成一个随机值(对称加密的私钥),然后用证书对随机值进行加密)
5)传输加密信息(这里传输的是加密后的随机值,目的是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密了)
6)服务端解密信息(服务端用私钥(非对称加密)解密后得到了客户端传来的随机值(对称加密的私钥),然后把通信内容通过该值(对称加密的私钥随机值)进行对称加密。所谓对称加密就是,将信息和私钥(对称加密的私钥)通过某种算法混在一起,这样除非知道私钥(对称加密的私钥),不然无法获取内容,而正好客户端和服务端都知道这个私钥(对称加密的私钥),所以只要加密算法够彪悍,私钥够复杂,数据就够安全)
7)传输加密的信息
8)客户端解密信息,用随机数(对称加密的私钥)来解。
默认情况下建立 TCP 连接不会断开,只有在请求报头中声明 Connection: close 才会在请求完成后关闭连接。
在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免.
如果维持持久连接,一个 TCP 连接是可以发送多个 HTTP 请求的。
HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,在 HTTP/1.1 存在 Pipelining 技术可以完成这个多个请求同时发送,但是由于浏览器默认关闭,所以可以认为这是不可行的。在 HTTP2 中由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。
TCP 连接有的时候会被浏览器和服务端维持一段时间。TCP 不需要重新建立,SSL 自然也会用之前的。
有。Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。
如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。
如果发现用不了 HTTP2 呢?或者用不了 HTTPS(现实中的 HTTP2 都是在 HTTPS 上实现的,所以也就是只能使用 HTTP/1.1)。那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了