美文网首页
HTTP归纳

HTTP归纳

作者: JLong | 来源:发表于2021-12-02 17:57 被阅读0次

    HTTP协议

    超文本传输协议(Hyper Text Transfer Protocol),是web(万维网、全球广域网)的网络协议与规范,用以客户端和服务端的通信。
    目前发展版本:2.0
    结构:基于B/S结构(Browser/Server,浏览器/服务器模式) // 3层C/S结构,服务器-客户机,即Client-Server(C/S)结构(两层结构)
    B/S:  1层:浏览器、2层 Web服务器、3层 数据库服务器
    C/S:服务器部分和客户机部分

    网络基础:TCP/IP

    HTTP协议是TCP/IP协议族的子集

    TCP/IP协议族:

    起因:计算机与网络设备需要互相通信,如语言、发起方式等,需要基于相同方法、规则,统称为协议(protocol)。

    分层:应用层、传输层、网络层、数据链路层(降低耦合度,避免一改全改,各司其职,互不干涉)

    应用层:决定了向用户提供应用服务时通信的活动,如文件传输、超文本传输和域名解析等。
    常见协议:FTP (File Transfer Protocol ) 文件传输协议、DNS(Domain Name System) 域名系统、HTTP(Hyper Text Transfer Protocol) 超文本传输协议

    传输层:为上层应用层提供网络连接中两台计算机的数据传输。
    常见协议:TCP(Transmission Control Protocol) 传输控制协议,UDP(User Data Protocol) 用户数据报协议

    网络层:处理网络上流动的数据包,换句话说就是规定通过什么方式(传输路线)到达对方计算机,并将数据包给对方。tip: 数据包是网络传输最小单位。常见协议:ICMP(Internet Cntrol Message Protocol)Internet控制报文协议(传输出错报告控制信息,IP子集)、IP (Internet Protocol) 网际互连协议 (TCP/IP核心协议,实现网络互联)

    数据链路层:处理连接网络的硬件部分,如操作系统、硬件设备驱动、NIC(Network Interface Card)网卡、光纤等可见部分(还包括连接器等一切传输媒介)。

    TCP/IP 通信传输流

    流程:发送端从应用层往下走,接收端往应用层走,每经过一层,发送端就会打上该层所属首部信息,接收端则消去一层首部信息。
    tip: 这种把数据信息包装起来的做法叫做封装(encapsulate)
    举例:客户端发送一个HTTP请求请求某个Web页面,会在传输层把应用层受到数据(HTTP请求报文)进行分割,并在每个报文打上标记序号端口号传到下层网络层,网络层带上MAC地址(物理地址,具备唯一性,作为通信目的地),再转发到数据链路层。接收端接受数据,往上发送,传输到应用层,才算完成整个请求流程。

    与HTTP关系密切的协议:IP、TCP、DNS

    IP (Internet Protocol)网际互连协议

    位置:网络层
    作用:实现网际互联,即各种数据包传输到对方,确保传输到位。
    需要条件:IP地址(节点被分配地址,可变换)、MAC地址(网卡所属固定地址、物理地址,唯一)
    通信方法:IP间依赖于MAC物理地址。网络通讯一般经过多台计算机和网络设备进行中转连接,中转时,可利用下一个目标设备MAC地址搜索目标。
    怎么获取MAC地址?可通过地址解析协议,即ARP(Address Resolution Protocol),根据IP地址获取MAC物理地址进而进行通信。
    tip: 中转过程,计算机和路由器等网络设备只能获悉粗略传输路线,有点像送快递,只知道送到哪里,不知道具体细节,这种机制叫做路有选择(routing)

    可靠的TCP(Transmission Control Protocol) 传输控制协议

    位置:传输层
    作用:提供可靠字节流服务。
    字节流服务:为方便传输,将大块数据切割报文段单位数据包进行管理。
    可靠服务:能够将数据准确可靠的传给对方。

    确保可靠的策略:三次握手

    三次握手:

    发送端首先发送一个带SYN标志的数据包给对方。

    接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。

    最后,发送端再回传一个带ACK标志的数据包,代表“握手” 结束。

    三次握手是否能够携带数据?

    前两次不能,第三次可以,前两次没有建立连接,如果可以携带数据,攻击者将不断发送数据进行恶意攻击,导致服务器崩溃。

    负责域名解析DNS服务

    位置:应用层

    作用:提供域名到IP地址之间的解析服务

    起因:计算机会被赋予IP地址、域名以及主机名,但一般使用者倾向于使用主机名或域名访问,但计算机理解名称会比较困难,计算机更擅长理解数字,所以通过DNS提供对域名进行解析,找到对应IP或者通过IP反向找到域名等服务。

    这些协议在HTTP协议的通讯过程中发挥着什么作用?(也就是面试常考题:从输入网址到显示页面的过程分析?)

    输入地址后,首先是会查找本地有无缓存,有缓存且没过时就直接返回。

    无缓存条件下,通过DNS解析域名找到地址对应IP返回给发送端。

    客户端根据HTTP协议生成发送给目标服务器的HTTP请求报文。

    接着客户端根据TCP协议将请求报文分割成报文段,通过三次握手与接收端建立TCP连接后,达到可靠传输。

    然后客户端通过IP协议定位地址,一边中转一边传输。

    服务器接收到报文段后通过TCP协议重组成请求报文。

    服务器根据HTTP协议对请求报文进行处理,返回对应资源。

    同样通过TCP/IP通信协议进行回传,最后四次挥手断开TCP连接。

    最后浏览器对请求回来的资源进行解析,解析HTML为DOM树、CSS为CSS Rule Tree(css规则树),然后浏览器引擎将这两个构建成Render Tree,接着开始进入layout布局处理阶段,即计算出每个节点在屏幕中的位置,最后就是节点渲染上去。


    URI 和 URL

    URI:

    统一资源标识符,用字符串标识某一网络资源。

    URL:

    统一资源定位符,URI子集,表示资源地点(互联网上所处位置)。

    组成:协议、域名、端口号、 路径、查询参数、锚点

    HTTP报文

    组成:请求报文、响应报文

    请求报文: 请求行、请求头、空行、请求体

    请求行:http方法、请求地址、http协议、版本

    请求头:key:value,告知服务器需要什么内容及类型

    空行:区分实体和首部

    请求体:参数

    响应报文: 状态行、响应头、空行、响应体

    状态行:http协议、版本、数字状态码及其英文名称

    响应头:key:value,告知服务器需要什么内容及类型

    空行:区分实体和首部

    响应体:服务端返回数据

    HTTP请求方法

    CONNECT

    要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer 安全套接字)和TLS(Transport Layer Security 传输层安全)协议把通信内容加密后经网络隧道传输。

    网络隧道:

    作用:构建VPN(虚拟专用网络),即利用一种网络协议来传输另一种网络协议。

    分类:二层隧道协议、三层隧道协议

    二层隧道协议:用于传输二层网络协议,它主要应用于构建远程访问虚拟专网(Access VPN)。

    三层隧道协议:用于传输三层网络协议,它主要应用于构建企业内部虚拟专网(Internet VPN)和扩展的企业内部虚拟专网(Extranet VPN)。

    持久连接/长连接

    HTTP/1.0版本没进行一次HTTP通信,都需要断开一次TCP连接,大量请求情况下增加了通信的开销。

    HTTP/1.1版本提出持久连接(HTTP Persistent Connections, 也称HTTP keep-alive 或HTTP connection reuse)

    长连接优缺点

    优点

    减少CPU及内存的使用,因为不需要经常建立和关闭连接

    支持管道化的请求及响应模式

    减少网络堵塞,因为减少了TCP请求

    减少了后续请求的响应时间,因为不需要等待建立TCP、握手、挥手、关闭TCP的过程

    发生错误时,也可在不关闭连接的情况下进行错误提示

    缺点

    一个长连接建立后,如果一直保持连接,对服务器来说是多么的浪费资源呀,而且长连接时间的长短,直接影响到服务器的并发数。

    还有就是可能造成队头堵塞,造成信息延迟。

    如何避免长连接资源浪费?

    客户端请求头声明:Connection: close,本次通信后就关闭连接。

    服务端配置:如Nginx,设置keepalive_timeout设置长连接超时时间,keepalive_requests设置长连接请求次数上限。

    系统内核参数设置

    net.ipv4.tcp_keepalive_time = 60,连接闲置60秒后,服务端尝试向客户端发送侦测包,判断TCP连接状态。

    net.ipv4.tcp_keepalive_intvl = 10,就在10秒后再次尝试发送侦测包,直到收到ack反馈。

    net.ipv4.tcp_keepalive_probes = 5,一共会尝试5次,要是都没有收到就关闭这个TCP连接了。

    管线化(管道化)

    持久连接使得管线化(pipelining)方式发送成为可能。

    HTTP/1.0,发送请求需要等待上一个请求发送并相应回来才能进行下一个。 HTTP/1.1管道化发送请求则可以同时发送。

    管线化是在同一个TCP连接里发一个请求后不必等其回来就可以继续发请求出去,这可以减少整体的响应时间,但是服务器还是会按照请求的顺序响应请求,所以如果有许多请求,而前面的请求响应很慢,就产生一个著名的问题队头堵塞

    特点:

    管线化机制通过持久连接完成,在http1.1版本才支持

    只有GET请求和HEAD请求才可以进行管线化,而POST有所限制

    初次创建连接时不应启动管线化机制,因为服务器不一定支持http1.1版本的协议

    管线化不会影响响应到来的顺序,如上面的例子所示,响应返回的顺序就是请求的顺序

    要求客户端和服务端都支持管线化,但并不要求服务端也对响应进行管线化处理,只是要求对于管线化的请求不失败即可

    由于上面提到的服务端问题,开户管线化很可能并不会带来大幅度的性能提升,而且很多服务端和代理程序对管线化的支持并不好,因为浏览器(Chrome/Firefox)默认并未开启管线化支持

    队头堵塞

    http1.0协议采用的是请求-应答模式,报文必须是一发一收,就形成了一个先进先出的串行队列,没有轻重缓急的优先级,只有入队的先后顺序,排在最前面的请求最先处理,就导致如果队首的请求耗时过长,后面的请求就只能处于阻塞状态,这就是著名的队头阻塞问题。解决如下:

    并发连接

    因为一个域名允许分配多个长连接,就相当于增加了任务队列,不至于一个队列里的任务阻塞了其他全部任务,现在的浏览器标准中一个域名并发连接可以有6~8个,记住是6~8个,不是6个(Chrome6个/Firefox8个)

    域名分片

    一个域名最多可以并发6~8个,那咱就多来几个域名

    比如a.baidu.com,b.baidu.com,c.baidu.com,多准备几个二级域名,当我们访问baidu.com时,可以让不同的资源从不同的二域名中获取,而它们都指向同一台服务器,这样能够并发更多的长连接了

    而在HTTP2.0下,可以一瞬间加载出来很多资源,因为支持多路复用,可以在一个TCP连接中发送多个请求

    使用Cookie进行状态管理

    起因:HTTP是无状态协议优点:不需要保持状态,减少服务器的CPU及内存消耗。也正是因为HTTP协议本身非常简单,所以被应用于不同场景。

    解决方案:Cookie

    Cookie

    作用:通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

    主要流程:Cookie会根据服务器端发送的响应报文内的Set-Cookie首部字段信息,通知客户端保存Cookie。当下次客户端再次发送请求,带上该Cookie;服务端根据客户端Cookie鉴定客户端来源,对比服务器记录,得到该客户端之前状态信息。

    Get和Post的区别:

    1、GET在浏览器回退时是无害的,而POST会再次提交请求。
    2、GET产生的URL地址可以被Bookmark(书签),而POST不可以。
    3、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    4、GET请求只能进行url编码,而POST支持多种编码方式。
    5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    6、GET请求在URL中传送的参数是有长度限制的,而POST么有。
    7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    9、GET参数通过URL传递,POST放在Request body中。

    常见 HTTP 状态码

    1xx: 指示信息——表示请求已接收,继续处理
    2xx:成功——表示请求已被成功接收
    3xx: 重定向——表示要完成请求必须进行进一步操作
    4xx:客户端错误——表示请求有语法错误或请求无法实现
    5xx: 服务端错误——表示服务端未能实现合法的请求

    HTTP代理

    普通代理(中间人代理)

    作用:可以过渡、缓存、负载均衡(多台服务器公用一台代理情况)等一些处理。
    tip: 实际情况下客户端和服务器之间可能有多个代理服务器。

    隧道代理

    客户端通过CONNECT方法请求隧道代理创建一个可以到任意目标服务器和端口号的TCP连接,创建成功之后隧道代理只做请求和响应数据的转发,中间它不会做任何处理

    为什么需要隧道代理呢?

    我们都知道https服务是需要网站有证书的,而代理服务器显然没有,所以浏览器和代理之间无法创建TLS(传输层安全性协议),所以就有了隧道代理,它把浏览器的数据原样透传,这样就实现了通过中间代理和服务端进行TLS握手,然后进行加密传输

    代理服务器,到底有什么好处呢?

    突破访问限制:如访问一些单位或集团内部资源,或用国外代理服务器(翻墙),就可以上国外网站看片等。
    安全性更高:上网者可以通过这种方式隐藏自己的IP,免受攻击。还可以对数据过滤,对非法IP限流等。
    负载均衡:客户端请求先到代理服务器,而代理服务器后面有多少源服务器,IP是多少,客户端是不知道的。因此,代理服务器收到请求后,通过特定的算法(随机算法、轮询、一致性hash、LUR(最近最少使用) 算法这里不细说了)把请求分发给不同的源服务器,让各个源服务器负载尽量均衡。

    缓存代理:将内容缓存到代理服务器。

    相关文章

      网友评论

          本文标题:HTTP归纳

          本文链接:https://www.haomeiwen.com/subject/yazyxrtx.html