从一个HTTP请求看网络分层

image.png
一条数据从A主机传送到B主机,在网络传输途中会出现各种各样的问题,因此我们进行网络分层,每一层都是解决不同的问题。

为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层的接口保持不变,就不会影响到其他层。分层结构有以下两种分法:
OSI(Open System Interconnection Reference Model,开放式系统互联通信参考模型):划分7层
TCP/IP协议族:划分5层
image.png
当在浏览器中输入域名地址www.baidu.com点击回车后会发生什么?
首先浏览器会解析域名,通过DNS获取服务器对应的IP地址;
应用层:DNS请求报文
接着调用传输层,在DNS请求报文的基础上,加上UDP请求头;
接着把数据交给网络层,在上述请求头的基础上,再加一个IP的请求头;
再把整个请求头交给数据链路层,进行2级寻址,把自己的MAC头和目标机器MAC头也加入请求头里;
最后通过物理层传输出去,后面再一层层拆解
image.png

HTTP协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP
一种无状态的,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动

http协议的请求报文和响应报文的结构基本相同,由三大部分组成:
1.起始行:描述请求或相应的基本信息 (GET /index.html HTTP/1.1 HTTP/1.1 200 OK)
2.头部字段集合:使用key-value形式更详细地说明报文 (Connection:keep-alive)
3.消息正文:实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
image.png
请求行报文格式

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25761560/1641298854564-31689e7a-e35a-457c-b026-8ba31033fac6.png#clientId=u48fde990-6453-4&crop=0&crop=0&crop=1&crop=1&id=HQk6W&name=image.png&originHeight=97&originWidth=663&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8015&status=done&style=none&taskId=u762ea7cf-11d8-4859-a40b-2ee3791db62&title=)
  • METHOD:对资源的操作,如GET,POST
  • URI:表示资源所在的位置,如/static/index.html
  • VERSION:Http协议的版本,如HTTP/1.1

响应行报文格式

image.png

  • VERSION:Http协议的版本,如HTTP/1.1
  • STATUS CODE:响应状态码,表示响应的结果,如200表示成功,404表示未找到对应的资源
  • REASON:响应的具体说明,是对STATUS CODE的补充

HTTP头字段
头字段是用key-value形式进行传输的,需要有几个注意事项

  • 字段名不区分大小写,字段名中间不能有空格,字段名可以使用”-“,但是不能使用”_”,因为有些服务器不解析下划线。字段名后面必须立马跟”:”。
  • 字段名顺序没有意义,可以任意排列。
  • 字段名原则上不能重复,有特殊语义的字段除外,例如Set-Cookie。

常用头字段
Http协议中存在非常多的字段,常用的有以下三类:

  • 请求字段:请求头中的字段,如Host、Referer。
  • 响应字段:响应头中的字段,如Cache-Control。
  • 通用字段:请求头和响应头中都有的字段,如Content-Type,Content-Length。

    HTTP请求的完整过程

    当用户再浏览器输入网址回车后,网络协议都做了哪些工作呢?
    1.首先干活的是浏览器应用程序,它要解析出URL中的域名;
    2.根据域名获取对应的ip地址,首先从浏览器缓存中查看域名对应的ip,如果没有,则从本机域名解析文件hosts(/etc/hosts)中查看,还没有则从LDNS,Rootserver域名服务器,国际顶级域名服务商的DNS的层层解析;
    3.拿到ip地址后,浏览器就可以发起与服务器的三次握手;
    4.握手建立后,就开始组装http请求报文,发送报文;
    5.服务器收到请求报文后,开始请求报文解析,生成响应数据,发送响应数据;
    6.浏览器收到响应后,开始渲染页面。
    image.png
    image.png

    TCP协议

    传输控制协议(TCP,Transmission Control Protocol)
    面向连接的,可靠的,基于字节流的传输层通信协议

特点:
基于连接的:数据传输之前需要建立连接
全双工的:双向传输
字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃 (即如果一个文件非常大,会对文件进行切分成很小的片段segment)
流量缓冲:解决双方处理能力的不匹配
可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
拥塞控制:防止网络出现恶性拥塞

TCP连接管理

TCP连接:四元组[源地址,源端口,目的地址,目的端口]
确立连接:TCP三次握手
a.同步通信双方初始序列号(ISN,initial sequence number)
b.协商TCP通信参数(MSS,窗口信息,指定校验和算法)
三次握手图如下:
image.png

四次挥手图如下:
image.png
A:发送FIN数据包,代表A不再发送数据
B:收到请求,开始应答,避免了A重新发送FIN重试(应答机制)
B:处理完数据后关闭,关闭连接,发送FIN请求
A:收到请求后发送ACK应答,B服务可以释放连接

为什么客户端主动发起关闭时,需要等待一个报文来回的时间(2MSL)呢(TIME_WAIT)?
1.防止报文丢失,导致B重复发送FIN 如果最后一条报文ACK j+1丢失,那么服务端会重复发送FIN seq=j,因此为了防止最后一条报文丢失,客户端不能立即关闭
2.防止滞留在网络中的报文,对新建立的连接造成数据扰乱

数据可靠性传输

滑动窗口协议与累计确认(延时ack)
滑动窗口对的大小,是通过tcp三次握手和对端协商,且受网络状况影响

即每次发送只能发送滑动窗口大小的报文,之后服务器再进行确认,若中间丢失,需重传

HTTPS协议

由于http天生”明文”的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求/响应报文,数据不具有可信性。
因此就诞生了为安全而生的HTTPS协议(即所有的HTTP请求和响应在发送到网络之前,都要进行加密)
image.png

SSL/TLS

SSL即安全套接层(Secure Sockets Layer),由网景公司于 1994 年发明,IETF 在 1999 年把它改名为 TLS(传输层安全,Transport Layer Security),正式标准化,到今天 TLS 已经发展出了主流的三个版 本,分别是 2006 年的 1.1、2008 年的 1.2 ,2018的 1.3,每个新版本都紧跟密码学的发展和互联网的 现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准。

摘要算法

摘要加密算法能将任意的数据加密成固定长度的密文,并且没有重复密文。明文数据只改变一点,生成的密文就会完全不同。常见的加密算法有MD5、SHA1、SHA2、SHA1 256等算法。

加密算法

对称密钥加密:编码,解码使用的都是相同密钥的算法。

非对称密钥加密:有两个密钥,一个叫”公钥”,一个叫”私钥”,两个密钥是不同的,公钥可以公开给任何人使用,而私钥必须严格保密。公钥加密的数据只能通过私钥进行解密,相反私钥加密的数据只能通过公钥进行解密。

TLS 里使用的混合加密方式,即把对称加密和非对称加密结合起来呢,两者互相取长补短,即能高效地
加密解密,又能安全地密钥交换。大致流程如下:

1.通信开始的时候使用非对称算法如 RSA,ECDHE先解决密钥交换的问题
2.用随机数产生对称算法使用的”会话密钥”,再用公钥加密。会话密钥很短,所以即便使用非对称加
密算法也可以很快完成加解密
3.对方拿到密文后用私钥解密,取出会话密钥。完成对称密钥的安全交换,后续就使用对称算法发完
成数据交换

身份验证

数字证书组成:CA信息,公钥用户信息,公钥,权威机构的签名,有效期
数字证书作用:1.通过数字证书向浏览器证明身份;2.数字证书里面包含了公钥

数字证书的申请和验证

     ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25761560/1641305955896-999f0182-7fd6-40e1-a33d-933818aa44f7.png#clientId=ud69127ca-be90-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=301&id=ub699d356&margin=%5Bobject%20Object%5D&name=image.png&originHeight=497&originWidth=908&originalType=binary&ratio=1&rotation=0&showTitle=false&size=99160&status=done&style=none&taskId=u4ec411cd-da7f-4d9c-95b9-1fed72df2db&title=&width=550)