OSI模型
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP模型
物理层、数据链路层、网络层、传输层、应用层
网络接口层、网络层、传输层、应用层
TCP 协议特性
最主要的三个特性是:面向连接的可靠流式传输
它提供了基于字节流的、全双工的数据传输,并通过确认应答、重传机制来保证可靠传输
TCP三次握手四次挥手
三次握手
- A请求B建立连接,进入待确认状态
- B同意并响应A的请求,进入待确认状态
- A发送确认包给B,A进入确认状态,B收到A的确认包后,B也进入确认状态
完成上述流程后,双方进入全双工通信。
必要性:
1、避免网络阻塞和历史连接等原因造成的系列号错乱,冗余连接会浪费资源,及时发出RST关闭连接
2、第三次确保了ACK+SYN并未丢失,序列号已同步,方能建立可靠连接
应对SYN攻击:(系统维护SYN队列和ACK队列,SYN队列被撑爆)
1、限制对服务器 SYN 请求的频率和次数
2、限制单个 IP 的 SYN 请求数
3、增大 SYN 队列的容量
4、使用 SYN Cookie 技术,服务端收到客户端的 SYN 请求时不立马分配资源,而是生成一些信息在 SYN+ACK 报文中返回给客户端,再收到客户端的 ACK 报文后才建立连接
四次挥手
- A请求B关闭连接,A不再发送新数据,没发完的继续发
- B同意并响应A的请求
- B不再发送新数据,没发完的继续发,完成后通知A关闭连接
- A收到B的关闭后,A的数据也发送完后,A通知B确认关闭,A在2MSL后也关闭连接
完成上述流程后,双方正式关闭连接。
TIME_WAIT为2MSL的作用:(MSL表示报文最大生存时间,而 2MSL 表示报文往返的最大生存时间,这足以让报文在网络中消失)
1、防止历史连接中的数据,被相同地址的新连接接收,造成错误数据。
2、正确关闭,防止最后的ACK报文丢失,B会重新发起 FIN 报文,若此时A已经关闭,收到B重传的 FIN 报文后,会返回 RST 报文。虽然也能关闭,但并不是一个正常的方式。
TCP通过以下机制来保证数据传输的可靠性:
-
序列号和确认应答:每个TCP报文段都包含一个序列号,用于标识报文段在数据流中的位置。接收方会发送确认应答,告知发送方已经成功接收到数据。
-
数据重传:如果发送方没有收到确认应答,会进行定时重传,确保数据可靠传输。
-
滑动窗口:TCP使用滑动窗口机制来控制发送方和接收方之间的数据流量。它允许发送方连续发送多个报文段,而不需要等待确认应答,从而提高传输效率。
-
拥塞控制:TCP具有拥塞控制机制,它通过动态调整发送速率来避免网络拥塞。当网络拥塞时,TCP会减少发送速率,确保网络的稳定性。
TCP和UDP的区别
TCP是传输控制协议,UDP是用户数据报协议。
TCP是面向连接的可靠数据流传输,UDP是无连接的不可靠报文协议。
TCP注重按照顺序到达目的地,拥有错误检测和重传机制。
UDP注重速度,可能会丢失、重复或乱序。
Http与Https的区别
端口分别是80和443。
HTTPS使用SSL(Secure Socket Layer)或TLS(Transport Layer Security)协议对通信进行加密,添加了加密和认证机制。
HTTPS开销大,但是更安全,采用了对称加密和非对称加密机制。
HTTPS 具备加密通信、校验机制和数字证书三个特性,从而保证了数据传输的安全性。
三次握手后的第四次握手就是加密的过程。
HTTP 2.0比1.0最大的提升大于,多路复用、头部压缩、服务端推送,
HTTPS 非对称加密+对称加密
-
服务器拥有非对称加密的公钥和私钥
-
服务端将收到请求后,将公钥明文传输给客户端
-
客户端随机生成一个对称加密的秘钥S,用公钥加密S后返回给服务器
-
服务器用私钥解密后获得对称加密秘钥S
-
双方通过秘钥S进行通信
中间人攻击:即中间人冒充了服务器。骗了客户端的数据,同时自己与服务端通信,骗了服务端数据。
为了防止中间人攻击,引入网络世界的“公理”——CA机构,让它给服务端颁发“身份证”——数字证书。
防止数字证书被篡改,需要对数字证书进行签名,再判断签名是否跟证书中的一致即可(就像下载文件校验MD5的原理)。这个签名叫——数字签名。
数字签名的制作过程:
- CA机构拥有非对称加密的公钥和私钥
- CA机构对证书的明文数据T进行hash
- 对hash后的值用私钥加密,得到数字签名S
数字证书 包含了 证书明文和数字签名,颁发给服务端
如何确保CA机构的公钥是可信的?(该公钥是否对应该网站)
客户端(系统、浏览器)会预装一些根证书,以根证书为起点,通过信任链层层信任,可以校验公钥是可信的。有时客户端需要内置证书 或 浏览器会提示需要下载证安装书(风险自己承担),此时客户端就拥有了可信的公钥。
上述可推导出:客户端(浏览器)自带CA机构的公钥。
客户端验证过程:
-
客户端拿到服务器返回的证书(带公钥)
-
客户端自带CA机构的证书对服务端证书进行校验
-
校验通过则证书可信任,否则警告提示不可信任,提示安装证书
安全通信机制流程图:
HTTP的9个请求方法
-
GET,获取数据;无body,有安全、幂等、可缓存的特性,数据在URL中,数据大小限制在浏览器对URL长度的支持,直接请求,有历史记录和缓存。
-
POST,提交数据;有body,无安全、幂等、可缓存的特性,数据不透明,数据大小无限制,需要先校验head,后校验body,所以抓包经常能看到post请求会有两次,其中一次是options验证Header,第二次才是data发送。
-
HEAD,获得报头;类似GET,无Response,用于查询资源是否存在
-
OPTIONS,询问支持的方法;在报文头的Allow字段中返回支持的方法(GET\POST等)
-
PUT,文件上传;类似POST,但PUT指定了资源存放位置,POST由服务端决定
-
PATCH,局部更新文件;对PUT方法的补充,对已知资源进行局部更新
-
DELETE,删除文件;请求服务器删除指定文件
-
TRACE,追踪路径;主要用于测试,客户端可以对请求消息的传输路径进行追踪,让服务端将之前的请求通信还给客户端
-
CONNECT,要求用隧道协议连接代理;实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
HTTP请求通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
Requet
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。
Response
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第二部分:消息报头,用来说明客户端要使用的一些附加信息。
第三部分:空行,消息报头后面的空行是必须的。
第四部分:响应正文,服务器返回给客户端的文本信息。
常见状态码
-
1XX,信息,请求正在处理
-
2XX,成功,请求正常处理,200成功
-
3XX,重定向,请求完成,但需要附加操作,301重定向
-
4XX,客户端错误,服务器无法处理请求,400请求错误,404无法找到资源
-
5XX,服务器错误,服务器出错,500内部错误,501无法处理请求
DNS流程
-
客户机向其本地域名服务器发出DNS请求报文
-
本地域名服务器收到请求后,查询本地缓存,假设没有该记录,则以DNS客户的身份向根域名服务器发出解析请求
-
根域名服务器收到请求后,判断该域名所属域,将对应的顶级域名服务器的IP地址返回给本地域名服务器
-
本地域名服务器向顶级域名服务器发出解析请求报文
-
顶级域名服务器收到请求后,将所对应的授权域名服务器的IP地址返回给本地域名服务器
-
本地域名服务器向授权域名服务器发起解析请求报文
-
授权域名服务器收到请求后,将查询结果返回给本地域名服务器
-
本地域名服务器将查询结果保存到本地缓存,同时返回给客户机
Cookie和Session
cookie是客户端状态保持方案,各浏览器大小限制不同,安全性低
session是服务器端状态保持方案,取决于服务端存储空间,常依赖于cookie回传sessionid,安全性高
浏览器中向域名发起请求后的全过程
-
浏览器通过DNS解析域名获得IP
-
浏览器发起一个到IP的HTTP请求
-
通过TCP封装数据包,随机选一个可用端口与服务器指定端口进行数据传输
-
网络层通过路由表查找到服务器的路径,期间会使用ARP协议进行查找
-
服务器收到数据并作出响应后,按上述流程原路返回给客户端
WebSocket是基于HTTP协议实现的长链接封装,是一种特定的通信协议。
Socket是基于网络层的封装,适应性广泛,用TCP、UDP等协议通信。