计算机网路协议
概览:
- TCP/IP四层模型
- HTTP三次握手和四次挥手
- TCP和UDP ;UDP丢包原因
- HTTP0.9 / HTTP1.0 / HTTP1.1 / HTTP2.0之间的区别
- HTTPS协议,工作原理以及加密算法。
- 浏览器从请求到响应,中间发生了什么?
1、TCP/IP的四层模型
数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序,中间需要经历很多过程,有多方参与对数据进行层层封装、转发。我们把这个流程在逻辑上进行分成层,每一层根据本层的规章制度(协议)各司其职。
TCP/IP协议可分为应用层、运输层、网际层、网络接口层。
应用层:与网络相关的程序通过网络与其他程序通信使用的数据格式规范。
- HTTP(80端口),主要用于普通浏览。
- HTTPS(443端口),HTTP协议的安全版本。
- FTP(20和21端口),用于文件传输。
- POP3(110端口),收邮件用。
- SMTP(25端口),用来发送电子邮件。
- SSH(22端口),用于加密安全登陆用。
- DHCP(67端口,动态主机配置协议),动态配置IP地址。
- DNS,用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
- SNMP,用于网络信息的收集和网络管理。
- ARP,用于动态解析以太网硬件的地址。
传输层:解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据按照正确的顺序到达这样的问题。
TCP/UDP协议
网际层:解决在一个单一网络上传输数据包的问题。
IP协议
网络接口层:它是数据包从一个设备的网络层传输到另外一个设备的网络层遵循的规范。
比如以太网协议、Wi-Fi协议。
2、HTTP三次握手和四次挥手
- 三次握手
第一次握手:客户端发送第一个包,其中SYN标志位为1, ACK=0,发送顺序号seq=x(随机int)。客户端进入SYN发送状态,等待服务器确认。
第二次握手:服务器收到这个包后发送第二个包,其中包SYN、ACK标志位为1,发送顺序号seq=Y(随机int),接收顺序号ack=x+1,此时服务器进入SYN接收状态。
第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=1,接收顺序号ack = Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。
为什么要三次握手?
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
由于网络传输是有延时的,在传输的过程中,例如客户端发起了SYN=1创建连接的请求(第一次握手),如果服务器端就直接创建了这个连接并返回包含SYN、ACK和Seq等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了。
客户端认为未成功建立连接,不会传输报文和关闭连接请求,服务器端的端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接,造成服务器端开销的严重浪费。
- 四次挥手
第一次挥手: 主动关闭方(客户端)发送第一个包,其中FIN标志位为1,发送顺序号seq为u。
第二次挥手: 被动关闭方(服务器)收到FIN包后发送第二个包,其中发送顺序号seq为v,接收顺序号ack为u+1。
第三次挥手: 被动关闭方(服务器)再发送第三个包,其中FIN标志位为1,发送顺序号seq为w,接收顺序号ack为u+1。
第四次挥手: 主动关闭方(客户端)发送第四个包,其中发送顺序号为u+1,接收顺序号为w+1。至此,完成四次挥手
为什么要四次挥手:
建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。
为什么要等2MSL:
如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;若客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。
3、TCP和UDP
TCP: 传输控制协议(Transmission Control Protocol)
UDP: 用户数据报协议(User Datagram Protocol)
主要区别:
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 无连接 |
是否可靠 | 可靠 | 不可靠 |
连接对象个数 | 一对一 | 支持单播、多播、广播 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 20-60字节 | 8字节 |
程序复杂度 | 较复杂 | 简单 |
系统资源开销 | 大 | 小 |
速度 | 慢 | 快 |
使用场景 | 适用于要求可靠传输的应用,例如文件传输 | 适用于实时应用(IP电话、视频会议、直播等) |
UDP丢包主要原因
- 发送的包过大:
- 若比64K大会导致UDP协议sendto返回错误。
- 若比MTU大,UDP包在接收端容易丢包,超过接收者缓存导致丢包。
- 发送包频率太块:
- 接收端来不及接收导致丢包。
- 发送端网卡处理不过来。在发送频率过快的时候考虑sleep一下。
- 接收端处理时间过长:
- 接收端两次调用recv方法接收数据之间发送过来的包可能丢失。
- 解决:可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
4、HTTP0.9 / HTTP1.0 / HTTP1.1 / HTTP2.0之间的区别
时间 | 版本 | 功能和区别 |
---|---|---|
1991 | HTTP/0.9 | 仅支持GET请求,不支持请求头; 服务器发送完请求就关闭TCP连接。 |
1996 | HTTP/1.0 | 默认短连接(一次请求建立一次连接,请求完成就断开连接); 支持GET、POST、HEAD请求; 增加了状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。 |
1999 | HTTP/1.1 | 默认长连接(一次TCP连接可以多次请求); 增加Host头,支持虚拟主机; 支持断点续传功能;新增五种请求方法OPTIONS、PUT、PATCH、DELETE、TRACE 、 CONNECT。 |
2015 | HTTP/2.0 | 多路复用(一次TCP连接可以同时处理多个请求); 解析基于二进制,解析错误少,更高效(HTTP/1.X解析基于文本); 服务器主动推送,允许服务器主动向客户端推送资源; 报头压缩,降低开销。 |
5、HTTPS协议
HTTP协议通常承载于TCP协议之上,HTTPS协议是在HTTP和TCP之间添加了一个安全协议层(SSL或TSL)。
作用:
①对数据进行加密,并建立一个信息安全通道,保证传输过程中的数据安全;
②对网站服务器进行身份认证,如果信息被篡改,通信双方可以立刻发现;
③数据完整性校验
HTTPS和HTTP的区别
HTTP | HTTPS | |
---|---|---|
协议 | 明文传输协议 | 加密传输协议 |
证书 | 不用 | 需要SSL证书 |
标准端口 | 80 | 443 |
定位 | 基于应用层 | 基于传输层 |
安全性 | 安全 | 不安全 |
HTTPS加密方式:
- 对称加密(又称密钥加密)
加密和解密都是使用的同一个密钥。常见的对称加密算法有 DES、3DES 和 AES 等。
优点:算法公开、计算量小、加密速度快、加密效率高,适合加密比较大的数据。
缺点:交易双方需要使用相同的密钥,也就无法避免密钥的传输,而密钥在传输过程中无法保证不被截获,因此对称加密的安全性得不到保证。每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一密钥,这会使得发收信双方所拥有的钥匙数量急剧增长,密钥管理成为双方的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。
- 非对称加密
加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥;公钥和算法都是公开的,私钥是保密的。常见的非对称加密技术是RSA技术。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公钥对外公开;得到该公钥的乙方使用公钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的私钥对加密后的信息进行解密。
优点:算法公开,加密和解密使用不同的钥匙,私钥不需要通过网络进行传输,安全性很高。
缺点:计算量比较大,加密和解密速度相比对称加密慢很多。
- 混合加密:
结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。
HTTPS的工作流程:
1、建立安全传输
在TCP连接建立完成以后,在HTTPS协议中,客户端和服务端会初始化SSL层,也就是安全层。
2、SSL握手
在发送报文之前,客户端和服务端会进行一次SSL握手,在这个过程中主要完成以下工作:交换协议版本号——选择一个两端都了解的密码——对两端的身份进行认证——生成临时会话密钥,以便加密信道(建立完安全通道后,传输报文时使用对称加密);
这里的认证是通过数字证书进行的,在客户端获取证书后,会采用相应的算法对服务端的身份信息进行验证,包括:
日期检测:客户端会检查证书的有效期是否合法;
签名颁布者可信度检测:浏览器会附带一个签名颁发机构的授信列表,如果浏览器收到了位置的颁发机构签发的证书,那么它会显示一条警告信息;
签名检测:客户端对签名使用签名颁发机构的公开密钥,然后将其与校验码比较,以便验证证书是否合法;
站点身份检测:客户端验证数字证书中的域名是否与服务端的域名匹配;
身份认证完成后,客户端与服务端进行密码协商,确定本次连接采用哪种加密算法进行通信。
3、开始通信
SSL握手完成后,就完成建立了HTTPS通道,客户端与服务端就会根据协商的加密算法进行通信。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5q64Alx-1596516899310)(C:\Users\安哥拉长毛兔\AppData\Roaming\Typora\typora-user-images\image-20200804113550456.png)]
6、在PC浏览器的地址栏输入URL,从发起请求到收到请求页面响应,发生了什么?
1、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存-ISP缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。
浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
5、握手成功后,浏览器向服务器发送http请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到HTTP响应
8、浏览器解码响应,如果响应可以缓存,则存入缓存。
9、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐…),对于未知类型,会弹出对话框。
10、 浏览器发送异步请求。
11、页面全部渲染结束。
送给20岁自己的一句话:
无论贫穷还是富有,无论疾病或是健康,无论顺利或是失意,请你每天都要保持学一点新东西的状态,至死方休,人间值得。