孤单小弟 —— HTTP : 浏览器做的第一步工作是解析 URL 生成发送给 Web
服务器的请求信息
真实地址查询 —— DNS : 通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web
服务器
Web
服务器域名与 IP
的对应关系,它就是 DNS
服务器指南好帮手 —— 协议栈 : HTTP 的传输工作交给操作系统中的协议栈
ICMP
协议和 ARP
协议。
ICMP
用于告知网络包传送过程中产生的错误以及各种控制信息。ARP
用于根据 IP 地址查询相应的以太网 MAC 地址可靠传输 —— TCP : HTTP 是基于 TCP 协议传输的;
CLOSED
状态。先是服务端主动监听某个端口,处于 LISTEN
状态。SYN
,之后处于 SYN-SENT
状态。SYN
,并且 ACK
客户端的 SYN
,之后处于 SYN-RCVD
状态。SYN
和 ACK
之后,发送对 SYN
确认的 ACK
,之后处于 ESTABLISHED
状态,因为它一发一收成功了。ACK
的 ACK
之后,处于 ESTABLISHED
状态,因为它也一发一收了MSS
的长度
MTU
:一个网络包的最大长度,以太网中一般为 1500
字节。MSS
:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度远程定位 —— IP : TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象
Genmask
)进行 与运算 与 destination 比较两点传输 —— MAC : 生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部
ARP
协议帮我们找到路由器的 MAC 地址
出口 —— 网卡 : 网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程
FCS
(帧校验序列)用来检查包传输过程是否有损坏送别者 —— 交换机 : 交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备
相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址
根据MAC地址表 , 交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口
如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。
以下两个属于广播地址:
FF:FF:FF:FF:FF:FF
255.255.255.255
数据包通过交换机转发抵达了路由器
出境大门 —— 路由器 :
HTTP 是什么?HyperText Transfer Protocol 超文本传输协议
http常见的状态码?
1xx
类状态码属于提示信息,是协议处理中的一种中间状态 用到的比较少2xx
类状态码表示服务器成功处理了客户端的请求 最愿意看到的状态3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码http常见的字段?
get与post的区别?
GET 和 POST 方法都是安全和幂等的吗
http缓存有哪些实现方式?
header + body
,头部信息也是 key-value
简单文本的形式,易于理解HTTP 由于是明文传输,所以安全上存在以下三个风险:
加入了 SSL/TLS
协议 :信息加密 校验机制 身份证书
如何解决?
混合加密的方式实现信息的机密性,解决了窃听的风险
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险
将服务器公钥放入到数字证书中,解决了冒充的风险
HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式:
采用「混合加密」的方式的原因:
SSL/TLS 协议基本流程:
前两步也就是 SSL/TLS 的建立过程,也就是 TLS 握手阶段。
SSL/TLS 的「握手阶段」涉及四次通信
HTTP/1.1 相比 HTTP/1.0 性能上的改进:
但 HTTP/1.1 还是有性能瓶颈:
Body
的部分;HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的
1. 头部压缩 :协议会帮你消除重复的部分。
2.二进制格式 :HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了**二进制格式 ** 增加了数据传输的效率
3.数据流 :不同 Stream 的帧是可以乱序发送的(因此可以并发不同的 Stream )
4.多路复用:HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应
5. 服务器推送 :HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务端不再是被动地响应,可以主动向客户端发送消息。
为什么需要 TCP 协议? TCP 工作在哪一层?
IP
层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性
因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的
什么是tcp? TCP 是面向连接的、可靠的、基于字节流的传输层通信协议
什么是 TCP 连接? 简单来说就是用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接
如何唯一确定一个 TCP 连接呢?
TCP 四元组可以唯一的确定一个连接,四元组包括如下:
有一个 IP 的服务器监听了一个端口,它的 TCP 的最大连接数是多少?
TCP 和 UDP 区别: 7个
1. 连接
2. 服务对象
3. 可靠性
4. 拥塞控制、流量控制
5. 首部开销
20
个字节,如果使用了「选项」字段则会变长的。6. 传输方式
7. 分片不同
TCP 和 UDP 应用场景:
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
FTP
文件传输;由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
DNS
、SNMP
等;一开始,客户端和服务端都处于 CLOSED
状态。先是服务端主动监听某个端口,处于 LISTEN
状态
客户端会随机初始化序号(client_isn
),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN
标志位置为 1
,表示 SYN
报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT
状态
服务端收到客户端的 SYN
报文后,首先服务端也随机初始化自己的序号(server_isn
),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1
, 接着把 SYN
和 ACK
标志位置为 1
。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD
状态
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK
标志位置为 1
,其次「确认应答号」字段填入 server_isn + 1
,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED
状态
服务器收到客户端的应答报文后,也进入 ESTABLISHED
状态
从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题
如何在 Linux 系统中查看 TCP 状态? netstat -napt
为什么是三次握手?不是两次、四次?
相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。”
这回答是没问题,但这回答是片面的,并没有说出主要的原因。
在前面我们知道了什么是 TCP 连接:
所以,重要的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。
接下来,以三个方面分析三次握手的原因: 三次握手的首要原因是为了防止旧的重复连接初始化造成混乱
FIN
标志位被置为 1
的报文,也即 FIN
报文,之后客户端进入 FIN_WAIT_1
状态。ACK
应答报文,接着服务端进入 CLOSED_WAIT
状态。ACK
应答报文后,之后进入 FIN_WAIT_2
状态。FIN
报文,之后服务端进入 LAST_ACK
状态。FIN
报文后,回一个 ACK
应答报文,之后进入 TIME_WAIT
状态ACK
应答报文后,就进入了 CLOSED
状态,至此服务端已经完成连接的关闭。2MSL
一段时间后,自动进入 CLOSED
状态,至此客户端也完成连接的关闭。你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。
这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。
为什么挥手需要四次?
再来回顾下四次挥手双方发 FIN
包的过程,就能理解为什么需要四次了。
FIN
时,仅仅表示客户端不再发送数据了但是还能接收数据。FIN
报文时,先回一个 ACK
应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN
报文给客户端来表示同意现在关闭连接。从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK
和 FIN
一般都会分开发送,从而比三次握手导致多了一次
为什么 TIME_WAIT 等待的时间是 2MSL?
MSL
是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL
字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。
MSL 与 TTL 的区别: MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。
TTL 的值一般是 64,Linux 将 MSL 设置为 30 秒,意味着 Linux 认为数据报文经过 64 个路由器的时间不会超过 30 秒,如果超过了,就认为报文已经消失在网络中了。
TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是: 网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。
比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN
报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。
可以看到 2MSL时长 这其实是相当于至少允许报文丢失一次。比如,若 ACK 在一个 MSL 内丢失,这样被动方重发的 FIN 会在第 2 个 MSL 内到达,TIME_WAIT 状态的连接可以应对。
为什么不是 4 或者 8 MSL 的时长呢?你可以想象一个丢包率达到百分之一的糟糕网络,连续两次丢包的概率只有万分之一,这个概率实在是太小了,忽略它比解决它更具性价比。
2MSL
的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。
在 Linux 系统里 2MSL
默认是 60
秒,那么一个 MSL
也就是 30
秒。Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒。
今天,将重点介绍 TCP 的重传机制、滑动窗口、流量控制、拥塞控制。 可靠传输的保证!!!
重传机制 TCP 实现可靠传输的方式之一,是通过序列号与确认应答
RTT
指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间 超时重传时间是以 RTO
(Retransmission Timeout 超时重传时间)表示
滑动窗口
那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值
窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除
假设窗口大小为 3
个 TCP 段,那么发送方就可以「连续发送」 3
个 TCP 段,并且中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」
这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
所以,通常窗口的大小是由接收方的窗口大小来决定的
流量控制
拥塞控制
swnd
和接收窗口 rwnd
是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值拥塞控制的慢启动
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,如果一上来就发大量的数据,这不是给网络添堵吗?
慢启动的算法记住一个规则就行:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1
慢启动算法,发包的个数是指数性的增长
DNS 域名解析,DNS 可以将域名网址自动转换为具体的 IP 地址
通过 ARP 协议,求得下一跳的 MAC 地址
DHCP 动态获取 IP 地址
于是,提出了一种网络地址转换 NAT 的方法,再次缓解了 IPv4 地址耗尽的问题。
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议 ICMP
主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等
IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间
ICMP
主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等IP
通信中如果某个 IP
包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知8
;部分资料来自于图解网络