一、TCP 和 UDP 的区别
我们一句话概率区别就TCP 是有连接的可靠传输,UDP 是无连接的不可靠传输。
1、TCP 在传输数据时需要先建立连接,UDP 不需要
2、TCP 传输的数据包比较复杂,UDP 传输的数据包比较简单
3、TCP 使用确认应答机制、超时重传机制、流量控制、拥塞控制保证可靠性,UDP每次发送多少就接收多少,即使丢失也不负责所以不可靠
4、TCP 面向字节流,且本身机构复杂+安全机制较多导致传输效率较低(延迟应答、捎带应答,滑动窗口有提高效率的作用,但是整体还是效率偏低),UDP 面向数据报传输效率高
二、什么是三次握手,什么是四次挥手
三、Get 请求和 Post 请求的区别是什么?
安全性(1)get 请求是不安全的,因为在传输过程,数据被放在请求的 url 中;post 请求的所有操作对用户来说都是不可见的。 但是这种说法也不是绝对的,也可以在 get 请求加上 request body,给 post 请求带上 url 参数。
请求长度限制(2)get 请求提交的 url 中的数据最多只能是几千个字节,这个限制是浏览器或者服务器给添加的,http协议并没有对 url 长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求;而 POST 请求没有明确的长度限制,但服务器可能会对请求体大小进行限制。
数据类型(3)get 请求只能进行 URL 编码,限制 form 表单的数据集的值必须为 ASCII 字符;而 post 请求支持整个 ISO10646字符集。
执行效率(4)get 请求的执行效率比 post 请求好。get 请求是 form 表单提交的默认方法。
幂等性(5)GET 请求是幂等的,多次发送相同的 GET 请求不会对服务器产生影响;而 POST 请求不是幂等的,多次发送相同的 POST 请求可能会对服务器产生多次影响。
传输层数据包区别(6)get 请求产生一个 TCP 数据包;post 请求产生两个 TCP 数据包。对于 get 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应200(返回数据);而对于 post 请求,浏览器先发送 header,服务器响应100 continue,浏览器再发送 data,服务器再响应200(返回数据)。当然具体的也要看浏览器。
缓存(7)浏览器一般会对 GET 请求进行缓存,也会保存在浏览器记录中;浏览器很少对 POST 请求缓存
四、HTTPS 和 HTTP 的区别是什么?
1、HTTP 协议的缺点:
- 通信使用明文,不安全
- 未验证接受者的信息,可能遭到伪装
- 无法验证报文的正确性,因为数据可能被篡改
2、 如果需要建立安全的通讯,则需要
- 通信安全:确保对方信息正确
- 数据安全:确保数据未篡改
3、HTTPS 介绍
HTTPS(安全套接字超文本传输协议),采用了SSL之后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
加密方法:SSL 采用一种公开的加密方法,方法是公开的,密钥是保密的
共享密钥:加解密使用同一个密钥,密钥也需要传送给对方,安全性低,效率高
使用两把秘钥的公开秘钥加密:使用一对非对称的秘钥,一把叫做私有秘钥,另一把叫做公开秘钥。客户端使用接收方的公开密钥进行加密发送数据。服务端使用自己的私有密钥进行解密使用。密钥无需要传送给对方,安全性高,效率低
HTTPS采用混合加密方式:利用两种加密方式的优点,组合起来进行通信;在交换秘钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享加密方式。
客户端如何知道服务端的公开密钥时可靠的?答:需要第三方介入认证
①服务器拥有公开密钥和 私有密钥,将自己的公开密钥等到数据证书认证机构。
②数字证书机构(CA机构)对服务器的公钥进行 **数字签名** ,并颁发 **公钥证书**(服务器公钥+CA的数字签名)
③客户端向服务端发送数据前先向CA机构验证服务端公钥的真实性
前提一:客户端要和CA机构通信前提知道 CA 机构的公钥。(提前植入到浏览器了)
前提二:客户端要和服务端通信前提知道公钥证书。(操作系统中安装了正确且受信任的证书,也是服务器提前发的)
客户端拿到公钥证书 ,使用 CA 的公钥向 CA 验证数字签名,就能验证 服务端的公钥 的真实性了。
④客户端 **用服务端的公钥 对共享密钥** 加密发送给服务端。
⑤服务器 **用私钥对功效密钥**解密读取数据
⑥客户端 **使用共享密钥 对 数据** 加密发送给服务端
五、域名解析过程 大佬的文章
我们知道网络中定位客户端和服务端计算机都是根据 IP 地址。我们访问百度首页时使用 域名 www.baidu.com。这中间是通过 DNS协议解析出其对应的 IP 为 128.23.14.16,具体流程如下:
0️⃣我的电脑:先在浏览器缓存和本地 Host 文件找 域名映射,如果找到了则直接返回。如果没有则继续向外界求助:
①我的电脑向本地 DNS 服务器发请求,例如:中国移动,中国电信等,如果本地 DNS 服务器域名映射表中存在则返回,否则继续。
本地 DNS 服务器接本应向权威域名服务器 baidu.com 继续请求查找 www.baidu.com 的 IP
根域名服务器 . 保存—》顶级域名服务器的IP,例如 .com 的IP
顶级域名服务器 保存—》权威域名服务器的IP,例如 baidu.com 的IP
如果本地有 baidu.com 的IP,则直接请求权威
无baidu.com 的IP,若有.com 的IP 则请求顶级域名服务器
无.com 的IP,则直接请求 根域名服务器
下面我们假设都没有的情况。
②本地 DNS 服务器 向 根域名服务器询问.com 的IP
③接收返回的 .com 的IP 127.23.45.78,并缓存
④本地 DNS 服务器 向 顶级域名服务器 询问 baidu.com 的IP
⑤接收返回的 baidu.com 的IP 155.123.34.56,并缓存
⑥本地 DNS 服务器 向 权威域名服务器 询问 www.baidu.com 的IP
⑦接收返回的 www.baidu.com 的IP,并缓存
⑧本地 DNS 服务器 向我的电脑发送 www.baidu.com 的IP
六、CDN
CDN 可以理解为服务器的代理。
例如我们需要向服务器获取资源,但是如果服务器距离我们太遥远,获取资源太耗时,此时就出现了 CDN , CDN 提供了很多节点,并且提供了一下作用
1、客户端请求 静态资源时,会先请求 CDN ,CDN 中如果有则直接返回,无则 CDN 请求服务器并保存,再返回给客户端
2、客户端请求 部分动态静态资源时,会先请求 CDN ,CDN 中会有少量服务器接口,直接返回
3、因为 CDN 介于客户端和服务端之间,则对客户端请求资源时起到了加速的作用,我们有时也称为 CDN 加速器
4、如果中间 CDN 节点压力过大马上宕机,会立刻以任播的形式从周围 CDN 节点找到最近的转移压力
八、你在浏览器输入一个网址,到页面加载出数据,都发生了那些事情?
当你在浏览器中输入一个网址后,以下是大致的步骤:
1、DNS解析:浏览器首先会将输入的网址发送给DNS服务器,以获取该网址对应的IP地址。DNS服务器将网址转换为相应的IP地址,并返回给浏览器。
2、建立TCP连接:浏览器使用获取到的IP地址与目标服务器建立TCP连接。TCP是一种可靠的传输协议,用于在网络上建立可靠的连接。
3、发送HTTP请求:一旦TCP连接建立,浏览器就会向服务器发送一个HTTP请求。这个请求包含了要访问的网页的相关信息,如请求方法(GET、POST等)、请求头部、请求体等。
4、服务器处理请求:服务器接收到浏览器发送的HTTP请求后,会根据请求的内容进行相应的处理。这可能涉及到数据库查询、业务逻辑处理等。
5、服务器发送HTTP响应:服务器处理完请求后,会将生成的响应发送回浏览器。响应包含了HTTP状态码、响应头部、响应体等信息。
6、浏览器渲染页面:浏览器接收到服务器发送的HTTP响应后,会根据响应中的内容进行页面渲染。它会解析HTML、CSS和JavaScript,并将它们转换为可视化的网页。
7、关闭连接:一旦页面渲染完成,浏览器会关闭与服务器的TCP连接。页面上的资源(如图片、脚本等)可能会继续通过HTTP请求加载。
应用层
1、输入的是域名,就需要先进性域名解析IP [www.baidu.com]
我的电脑:浏览器检查浏览器缓存 + 本地 Host 文件 查找 IP 地址
本地DNS服务器:中国电信、中国移动 查自己的缓存记录
2、HTTP 协议请求默认按照 GET 请求处理,会在数据内容的基础上加一层 Header 标头组织成 GET 请求的格式。
传输层
1、HTTP 协议是基于传输层的 TCP 协议,针对 GET 请求浏览器一般指发出一个TCP 请求包。http header 和 data 一并发送出去。(这点和 POST 请求的处理有些不同)
2、TCP 协议会在上层数据包基础上增加一层标头,其中会包含发送端+接收端的 Port 信息
3、TCP 进行三次握手
网络层
1、IP 协议会在上层数据包基础上增加一层标头,其中会包含发送端 + 接收端的 IP 信息。
2、ARP 协议会根据接收端的 IP 信息解析出接收端的 MAC 地址
数据链路层
1、以太网协议会已知接收者的 MAC 信息后进行广播找到接收者,在上层数据包基础上增加一层标头,其中包含 MAC 地址。
2、将上面信息继续解析,按照每组 0/1 信息进行分组解析。
物理层
将上层的光电信息使用物理设备进行传输到服务器
到达服务器之后。再逆向解析出请求数据。
九、Socket 编程 大佬文章
在计算机网络编程技术中,两个进程或者说两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(英文名称也就是Socket)。
Socket是网络驱动层提供给应用程序的一个接口或者说一种机制。
java.net 包的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务器端,进行网络通信时,Socket需要借助数据流来完成数据的传递工作
基于 TCP 的Socket网络编程
客户端实现步骤:
1)建立连接,连接指向服务器及端口。
2)打开Socket关联的输入/输出流
3)向输出流中写入信息
4)从输入流中读取响应信息。
5)关闭所有的数据流和Socket。
服务器端实现步骤:
1)建立连接,监听端口。
2)使用accept()方法等待客户端发起通信
3)打开Socket关联的输入/输出流。
4)从输入流中读取请求信息。
5)向输出流中写入信息。
6)关闭所有的数据流和Socket。
基于 UDP 的Socket网络编程
发送方实现步骤:
1)获取本地主机的InetAddress对象。
2)创建DatagramPacket对象,封装要发送的信息。
3)利用DatagramSocket对象将DatagramPacket对象数据发送出去。
接收方实现步骤:
1)创建DatagramPacket对象,准备接收封装的数据。
2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
3)利用DatagramPacket对象处理数据。