模块一:基础
OSI七层架构
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
TCP/IP架构
应用层:HTTP,HTTPS,FTP,SMTP
传输层:TCP,UDP
网络层:IP,ARP
数据链路层:MAC地址在这里。
模块二:HTTP
- 基础:
超文本传输协议
可以理解为
两点之间传输超文本的协议
不是服务端到浏览器,是一个双向协议,也可以浏览器到服务端。
HTTP是无状态的,所以经常用cookie来保存。
- HTTP状态码:
1开头,中间状态。
2开头,成功状态。
3开头,重定向状态。
4开头,客户端发送的报文错误,无法访问。
5开头,服务端处理时,内部发生错误。
- HTTP常用字段:
Host字段:指定目的服务器地址,如Host:www.syjjj.com
Content-Length:数据/报文长度
Conection:Keep-Alive 连接方式:长连接
HTTP1.1之后都是默认长连接了,这个字段是为了兼容过去的Http版本。
Content-Type:text/html 本次回应数据的格式
Accept:* / * 客户端告诉服务端,可以接受所有类型数据。
Content-Encoding:数据压缩方法
- HTTP报文:
报文分成三部分:首部,空行,主体。
HTTP报文分为两种:请求报文和响应报文。
请求报文的结构:
请求行 - 请求首部 - 空行 - 报文主体
响应报文:
状态行 - 响应首部 - 空行 - 报文主体
请求行:请求方法(get/post) HTTP版本,URI
状态行:响应结果的状态码,原因,HTTP版本。
- 请求方法get和post
get的含义是请求服务器资源。
post的含义是向uri指定的资源提交数据。
所以get是安全且幂等的,post不安全也不幂等。
- HTTP的特性:简单,灵活和易于扩展,应用广泛和跨平台。
简单:HTTP报文的基本格式就是:header body。
- HTTP协议特性的双刃剑:无状态和明文传输。
无状态:
优点:服务器不需要记忆HTTP的状态,省资源。
缺点:完成关联性操作比较麻烦,需要用到cookie(客户端)和session(服务端)。
Cookie技术:客户端第一次请求的时候,服务端的响应报文带上Cookie。以后每次交流报文加上Cookie来识别身份。
明文传输:
优点:方便阅读,比如我们F12就能看见内容。
缺点:不安全
- HTTP的最大缺点就是不安全
明文可能被窃听。
不验证双方的身份,可能遭遇伪装。
无法证明是否被篡改。
所以出现了HTTPS。
- HTTP/1.1和HTTP/1.0
HTTP是基于TCP/IP的“请求-应答模式”。
HTTP/1.1增加了长连接。
因为长连接,所以出现了管道网络传输。
但是由于“请求-应答模式”,所以会出现队头阻塞。
队头阻塞:阻塞队列的请求被阻塞了,则后面请求全在等着。
HTTP/1.1的性能就一般般,所以HTTP/2和HTTP/3都在优化性能。
- HTTP和HTTPS
区别:
1,HTTPS是HTTP加上SSH/TLS安全协议,可以加密传输。
2,HTTP的传输很容易,TCP三次握手后就可以开始HTTP的传输。
代码语言:javascript复制HTTPS的传输要在TCP的三次握手后再加入SSH/TLS的握手过程,才能传输。
3,HTTP的端口是80,HTTPS是443。
4,HTTPS引入CA的数字证书。
HTTPS解决HTTPS哪些问题?
HTTP的三大问题:窃听风险,篡改风险,冒充风险。
HTTPS的SSH/TLS很好的解决了三个问题。
信息加密:交互信息无法被窃听。
校验机制:修改了就不能正常接收。
身份证书:证明你妈是你妈。
HTTPS是怎么解决的
信息加密用混合加密的方式来实现。
校验机制:用摘要算法为数据生成独一无二的标志,用来校验数据完整性。
身份证书:公钥放在数字证书中。
1,混合加密
通信建立前通过非对称加密交换秘钥,后续不再使用。
通信过程通过对象加密加密明文数据
2,摘要算法
将摘要算法算出来的标志和明文一起给服务器,服务器用相同的摘要算法算出的标志和客户端传来的标志对比,来保证完整性。
3,身份证书:CA发布。
- HTTPS怎么建立连接的
1,先建立TCP三次握手。
2,客户端向服务器索要验证服务器的公钥。
3,双方协商生产会话秘钥。
4,双方采用秘钥通信。
2和3就是SSH/TLS的握手过程。
SSL/TLS的四次握手流程:
1,客户端向服务端发起Client hello请求。
内容:
客户端支持的SSH/TLS版本。
随机生成数,用于生成秘钥。
客户端支持的加密算法。
2,服务器向客户端发起Server hello请求。
内容:
确定SSH/TLS版本。
随机生成数。
确认的加密算法。
服务器的数字证书(公钥在这里)。
3,客户端回应
客户端先查看数字证书是否靠谱。
没问题的话客户端从数字证书取出公钥。
随机生成数,这时候要用公钥加密。
通知后续通信用秘钥加密的方式。
客户端握手结束通知。
4,服务端回应
通过三个随机数,算出会话秘钥。
通知后续通信用秘钥加密的方式。
握手结束通知。
总结:可以得出会话秘钥是用三个随机生成数算出的,2个来自客户端。
- HTTP的提升过程
1,HTTP1.1比HTTP1.0提升了什么?
长连接,管道网络传输。
2,HTTP2比HTTP1.1提升了什么?
头部压缩
数据二进制
数据流:不是按顺序发送,连续数据包可能来自不同的请求。所以,必须对每个数据包做标志,是来自哪里的。
多路复用:可以一个连接中并发多个请求或响应,移除了串行请求问题,解决了队头阻塞问题。
举例:在⼀个 TCP 连接⾥,服务器收到了客户端 A 和 B 的两个请求,如果发现 A 处理过程⾮常耗时,于是就
回应 A 请求已经处理好的部分,接着回应 B 请求,完成后,再回应 A 请求剩下的部分。
服务器推送:服务器可以主动给客户端发消息了。
HTTP2的问题:基于TCP实现的,所以如果发送丢包,后面都要等他重传回来。
HTTP3的改进:TCP改成UDP,通过QUIC技术实现了TCP的可靠传输。
模块三:TCP
- TCP的头部格式
序列号:用于保证数据包的有序。随机数为初始值,发送一个 1。
确认应答号:期望下一个接到的包的序列号,用来解决不丢包问题。
控制位:
ACK:为1时,确认应答号有效。
FIN:终止连接为1
RST:为1时,出现异常必须中断。
SYN:建立连接为1,同时要初始化序列号。
- 什么是TCP
面向连接的,可靠的,面向字节流的传输层通信协议。
面向连接:一对一通信。
可靠的:需要三次握手才能通信。保证一个报文能到达通信端。
面向字节流的:消息是「没有边界」的,所以⽆论我们消息有多⼤都可以进⾏传输。并且消息是「有序的」,当「前⼀个」消息没有收到的时候,即使它先收到了后⾯的字节,那么也不能扔给应⽤层去处理,同时对「᯿复」的报⽂会⾃动丢弃。
- 什么是TCP连接
(来自百度,不咋理解)⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗⼝⼤⼩称为连接。
所以说TCP连接需要保证这些因素:
Socket:由IP地址和端口组成。
序列号:解决乱序问题。
窗口大小:用于流量控制。
- 如何确定一个TCP连接
需要一个四元组:源地址,源端口,目的地址,目的端口。
源地址和目的地址存在IP协议,源端口和目的端口存在TCP协议。
- UDP和TCP的区别
UDP是广播方式,TCP是点对点。
UDP不保证交付,近最大可能交付。TCP可靠传输。
UDP协议非常简单,只有四个部分:源端口,目的端口,包长度,校验和。
TCP有流量控制,拥塞控制,UDP啥也没有。
TCP是流式传输,没有边界(基于字节流)。UDP是包传递,有边界的,可能会乱序和丢包。
TCP用于FTP,HTTP。UDP用于DNS,视频,广播。
- TCP三次握手过程
1,⼀开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端⼝,处于 LISTEN 状态。
2,第一次握手:客户端将SYN为1,初始化序列号,然后发给服务端,客户端变为SYN-SENT状态。
3,第二个握手:服务端收到后,把SYN和ACK为1,初始化序列号,将客户端传来的序列号 1放到确认应答号上。服务端变为SYN-RCVD。
4,第三次握手:客户端收到后,把ACK为1,确认应答号为服务端传来的序列号 1,客户端变为ESTABLISHED。
5,服务端收到后,也变成ESTABLISHED。
- 为什么要三次握手
保证双方都有接受和发送的能力。
避免重复的历史链接。
同步双方初始序列号。
三次握手避免资源浪费。
- TCP四次挥手过程
客户端打算关闭连接,此时会发送⼀个 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回去,不发送数据但是可能要处理数据。
处理完数据再回FIN。
所以说中间两次挥手时间,是为了个服务器处理数据的时间。
- TIME_WAIT状态(有机会要好好补充)
TIME_WAIT的等待时间是2MSL,报文最大生存时间的两倍。
主动发起关闭连接的一方,才有TIME_WAIT。
它存在的理由:
1,防⽌具有相同「四元组」的「旧」数据包被收到;
2,保证「被动关闭连接」的⼀⽅能被正确的关闭,即保证最后的 ACK 能让被动关闭⽅接收,从⽽帮助其正常关闭;
TCP 就设计出了这么⼀个机制,经过 2MSL 这个时间,⾜以让两个⽅向上的数据包都被丢弃,使得原来连
接的数据包在⽹络中都⾃然消失,再出现的数据包⼀定都是新建⽴连接所产⽣的。
TCP的机制
重传机制,滑动窗口,流量控制,拥塞控制,
1,重传机制
TCP保证可靠传输的方式之一,采用序列号和确认应答号实现,针对数据包丢失问题。
常见的重传机制:
超时重传(ARQ协议),快速重传,SACK,D-SACK。
TCP会在两个情况下发送重传:数据包丢失,确认应答号丢失。
超时重传
发送一个数据的时候,设置一个定时器,如果超过时间,另外一端没传回来ACK,就会触发超时重传。
RTT:包在两端往返的时间。RT0:超时时间。
RTO稍微比RTT大点就可以了。
快速重传
它不以时间为驱动,以数据为驱动。
它一次传递多个数据包
快速重传的⼯作⽅式是当收到三个相同的 ACK 报⽂时,重传丢失的报⽂段。以ACK为主。
但是也有问题,他解决了超时问题,但是有一个问题,重传是重传这个报文,还是全部报文。
SOCK
这个是为了解决快速重传问题。
D-SOCK
阿这
2,滑动窗口
窗口大小就是不需要等待确认应答,可以继续发送数据的最大值。
窗口大小由接收方决定,发送方窗口约等于接收方窗口。
应用的是滑动窗口算法,一直右移(发送),直到窗口满了,等待左边接受到确定,再继续右移。
3,流量控制
发送方不能一直发数据给接收方,也需要考虑接收方的能处理数据能力。
如果接收方处理不过来,就会出现TCP的重传机制。
为了解决这个问题,TCP就提供一种机制,让发送方根据接收方的处理能力控制数据发送量。
避免发送方的数据堆满接受方的缓存。
4,拥塞控制
网络堵塞的时候,如果TCP一直发,会导致网络更加拥堵。
所以这玩意的用处就是避免发送方的数据包占满整个网络,emmmmm...
定义了一个拥塞窗口的设定,根据网络拥塞程度动态变化。
- 如何判断是否拥塞
没接收到接收方的ACK就是拥塞
- 拥塞控制的算法
慢启动
拥塞避免
拥塞发生
快速恢复
模块四:IP
IPV4地址是32位。255.255.255.255
- IP地址分类
A类:0开头,主机号24位,第一段是网络号。
B类:10开头,主机号16位,前二段是网络号。
C类:110开头,主机号8位,前三段是网络号。
D类:1110开头
E类:1111开头
- 怎么计算机哪类网络的主机数呢?
比如C类网的主机号是8位,那么就是2的8次方-2。
全为1的是广播,全为0是网络。
- 广播地址分类
直接地址:不同网络之间的通信
本地地址:本网络之间的通信
- 什么是D,E地址
D类地址用于多播,E类还没用上。
- 多播:
给特定组全部主机广播。
通常不可以穿透路由:要是不同网络,需要使用能穿透路由的多播。
- IP分类的两个缺点
同一网络下没有地址层次。
不符合现实需求,比如A类网只有254个地址。
- 无分类地址CIDR
解决IP分类的问题,推出CICR。
A.B.C.D/x
表示前x位是网络号。
- 子网掩码
另外一种表示网络号和主机号的方式。
掩码1的地方表示网络号,0表示主机号。
- 子网划分
子网除了划分网络号主机号,还划分子网。
子网将主机号划分为子网网络地址和子网主机地址。
- 公有IP地址和私有IP地址
A,B,C类地址里面有公有地址和私有地址。
- IP地址和路由控制
IP地址的网络部分用于路由控制。
就是路由表。
在发送 IP 包时,⾸先要确定 IP 包⾸部中的⽬标地址,再从路由控制表中找到与该地址具有相同⽹络地址的记录,根据该记录将 IP 包转发给相应的下⼀个路由器。如果路由控制表中存在多条相同⽹络地址的记录,就选择相同位数最多的⽹络地址,也就是最⻓匹配。
环回地址:同一个计算机上程序之间通信用的默认地址,localhost和127.0.0.1。
- IPV6
有128位,是IPV4位数的4倍。
IPV4和IPV6不能互相兼容。
模块五:其他协议
1,DNS:
应用层协议。
解析方式有:递归和迭代。
DNS域名服务器结构:
根DNS服务器
顶级域DNS服务器(com)
权威DNS服务器(syj.com)
客户端只要能够找到任意⼀台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再⼀路顺藤摸⽠找到位于下层的某台⽬标 DNS 服务器。
2,ARP:
IP层协议。
主机的下一跳可以找到IP地址,通过ARP协议,找到下一跳的MAC地址。
ARP请求和ARP响应包来确定MAC地址的。
实现:主机通过ARP协议,广播到每个主机。每个主机拆开协议查看是不是自己的IP地址,是的话把自己的MAC地址插进去,传回主机。
3,RARP:
已知MAC地址求IP地址。
4,DHCP
通过DHCP动态获取IP地址。
5,NAT
网络地址转换NAT,缓解IP地址紧缺问题。
同一公司可能同一个公有IP地址。
6,ICMP
数据包在网络层出现错误时,返回出错原因。
确定IP包是否成功送达目的地。
7,PPP
数据链路层。
点对点连接计算机的协议。
同等单元直接传输的协议,单元指物理设备,缆线啊啥的。
模块六:有意思的问题
- ping