HTTP基础知识

  1. http,https默认端口都为多少,区别?

  2. http协议的组成

  3. OSI七层模型

  4. url 和 uri

  5. http1.0和http1.1,http2.0的区别?

  6. get/post方法区别?

  7. cookie和session区别?

  8. 打开浏览器,在地址栏中输入URL,然后就看到网页,原理是什么?

  9. http协议下,为什么请求和响应能做到准确无误,一一对应

  10. DNS劫持

  11. SSL和TLS

HTTP

超文本传输协议,一种运用广泛的网络协议,所有的www文件都必须遵守这个标准

http通常承载于 tcp协议 之上,有时也承载于 TLS 和 SSL 协议层之上,这就是 HTTPS

HTTP默认端口 80

HTTPS默认端口 443

HTTP协议的特点:

  1. 支持客户/服务器模式

http是一种客户请求,服务器应答式的应用层传输协议

  1. 简单快速

客户端向服务器发送请求数据时,只需传送方法和路径,请求方法常用的有 GET, HEAD, PUT

  1. 灵活性

http允许传输任意类型的数据对象,正在传输的类型由 Content-Type 加以标记

  1. 无连接,无状态

每次http请求都是独立的,每次只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接,任意两个请求之间没有什么必然的联系,但实际过程中并不是这样的,会引入 Cookie 和 Session 机制来关联请求

HTTP请求由请求行,请求头,请求体三部分组成:

  1. 请求行

请求行包含三部分:

  • method

  • uri

  • http版本,提示信息

image.png

1.1 method

1.2 URI 统一资源标示符

URL 统一资源定位符

image.png

URI包含 URN 和 URL,URN作用相当于 一个人的名字,URL 就像一个人的地址,URN确定了身份,URL 提供了找到他的方式

让URI成为 URL的 就是 “访问机制” “网络位置”

  • ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)

  • http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)

  • ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)

  • mailto:[email protected] (also a URL because of the protocol)

  • news:comp.infosystems.www.servers.unix (also a URL because of the protocol)

  • tel:+1-816-555-1212

  • telnet://192.0.2.16:80/ (also a URL because of the protocol)

  • urn:oasis:names:specification:docbook:dtd:xml:4.1.2

OSI七层模型

image.png
image.png
image.png
image.png

应用层:用来生成报文

传输层:用来切割报文的

网络层:决定发往哪里去,按什么顺序发,网络层可以看成是个指路牌,即根据报文在路由表里寻找目标服务器的地址。

链路层:链路层是用来检测、确认报文数据,然后就是作为接口,对接服务器或硬件的。

HTTP1.0,1.1,2.0之间的区别:

http1.0 和 http1.1 区别:

  • 缓存处理

  • 带宽优化及网络连接的使用

  • Host头处理

  • 长连接 keep live

  • 错误通知的管理

1.1 缓存处理

http1.0主要持有它的头部当中的if-modify-since这个参数来作为缓存判断的标准,而http1.1则引入了更多的缓存策略。比如说e_ tag、if-none_match, e_tag是配合in_none_match来使用。就是说http1.0和http1.1主要在缓存策略上有很大的不同

1.2 带宽优化及网络连接使用

断点续传

在http1.0存在着一些浪费带宽的情况,比如说客户端只请求服务端的一小部分,但是服务端却把所有的东西都返回回来了,但是又不支持断点续传功能,而在http 1.1中引入了一个range范围的头部区域,它允许只请求网络资源的一部分。这样就方便了开发者的选择。

1.3 Host头处理

在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)

一个ip地址可以分配多个虚拟主机,最终请求都到这一个ip,需要区分是哪个域名请求过来的,必须有Host头处理

1.4 长连接

HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

1.5 错误通知

在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

http1.1 和 http 2.0 区别:

  • 新的传输格式:2.0采用二进制格式,1.0基于文本格式

  • 多路复用:连接共享,不同request可以使用同一个连接传输(最后根据每个request上id号组合成正常请求)

  • header压缩:由于1.X中header带有大量的信息,并且得重复传输,2.0使用encoder来减少需要传输的hearder大小

  • 服务端推送:同google的SPDUY(1.0的一种升级)一样

GET和POST区别?

image.png

(https://blog.fundebug.com/2019/02/22/compare-http-method-get-and-post/)

(https://www.oschina.net/news/77354/http-get-post-different)

当我们打开浏览器输入网址到页面展示到我们面前,究竟发生了什么呢?

(https://zhuanlan.zhihu.com/p/88940868)

HTTP协议下,请求和响应这么做到一一对应的

互联网通信都是通过套接字来进行通信的,套接字,是支持TCP/IP网络通信的基本操作单元,可以看作不同主机之间进程进行相互通信的端点,简单说就是通信双方的一种约定,用套接字相关函数来完成相关通信。

简单可以举例为: 套接字 = ip address + tcp/udp + 端口号

socket通信靠四元组进行通信:

源ip 源端口 目的ip 目的端口

这四个值在一起起到了唯一定义一条连接,两个不同的tcp连接不能拥有4个完全相同的地址组件值

有的连接共享了相同的目的端口号,有点连接使用了相同的源ip地址,有的使用了相同的目的ip地址,但没有两个不同的tcp连接4个值完全相同

一. HTTP通信传输

通信过程

image.png

客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。

image.png

报文从应用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。

(https://zhuanlan.zhihu.com/p/74466717)

三次握手

image.png

为什么需要三次握手呢?

为了防止已失效的连接请求报文又发送到服务端,因而产生错误

比如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但是server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了,由于client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的运输连接已经建立,并一直等待client发来数据。所以没有采用“三次握手”,这种情况下server的很多资源就白白浪费掉了。

四次挥手

[图片上传中...(image-218763-1574231629256-1)]

为什么需要四次挥手呢?

为什么需要四次挥手呢?TCP是全双工模式,当client发出FIN报文段时,只是表示client已经没有数据要发送了,client告诉server,它的数据已经全部发送完毕了;但是,这个时候client还是可以接受来server的数据;当server返回ACK报文段时,表示它已经知道client没有数据发送了,但是server还是可以发送数据到client的;当server也发送了FIN报文段时,这个时候就表示server也没有数据要发送了,就会告诉client,我也没有数据要发送了,如果收到client确认报文段,之后彼此就会愉快的中断这次TCP连接。

什么是全双工呢?

(https://blog.csdn.net/yimingsilence/article/details/72854516)

二. HTTPS实现原理

image.png

  • client向server发送请求https://baidu.com,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。

  • server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集。

  • 随即server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。

  • 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)。

  • 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥。

  • 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值1、随机值2和预主秘钥。

  • 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。

  • 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。

  • 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。

HTTP 状态码

image.png
image.png
image.png
image.png

具体应用

image.png

参考文献(https://juejin.im/post/5dc63c5bf265da4d17138c2d?utm_source=gold_browser_extension)

你可能感兴趣的:(HTTP基础知识)