http,https默认端口都为多少,区别?
http协议的组成
OSI七层模型
url 和 uri
http1.0和http1.1,http2.0的区别?
get/post方法区别?
cookie和session区别?
打开浏览器,在地址栏中输入URL,然后就看到网页,原理是什么?
http协议下,为什么请求和响应能做到准确无误,一一对应
DNS劫持
SSL和TLS
HTTP
超文本传输协议,一种运用广泛的网络协议,所有的www文件都必须遵守这个标准
http通常承载于 tcp协议 之上,有时也承载于 TLS 和 SSL 协议层之上,这就是 HTTPS
HTTP默认端口 80
HTTPS默认端口 443
HTTP协议的特点:
- 支持客户/服务器模式
http是一种客户请求,服务器应答式的应用层传输协议
- 简单快速
客户端向服务器发送请求数据时,只需传送方法和路径,请求方法常用的有 GET, HEAD, PUT
- 灵活性
http允许传输任意类型的数据对象,正在传输的类型由 Content-Type 加以标记
- 无连接,无状态
每次http请求都是独立的,每次只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接,任意两个请求之间没有什么必然的联系,但实际过程中并不是这样的,会引入 Cookie 和 Session 机制来关联请求
HTTP请求由请求行,请求头,请求体三部分组成:
- 请求行
请求行包含三部分:
method
uri
http版本,提示信息
1.1 method
1.2 URI 统一资源标示符
URL 统一资源定位符
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七层模型
应用层:用来生成报文
传输层:用来切割报文的
网络层:决定发往哪里去,按什么顺序发,网络层可以看成是个指路牌,即根据报文在路由表里寻找目标服务器的地址。
链路层:链路层是用来检测、确认报文数据,然后就是作为接口,对接服务器或硬件的。
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区别?
(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通信传输
通信过程
客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。
报文从应用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。
(https://zhuanlan.zhihu.com/p/74466717)
三次握手
为什么需要三次握手呢?
为了防止已失效的连接请求报文又发送到服务端,因而产生错误
比如: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实现原理
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 状态码
具体应用
参考文献(https://juejin.im/post/5dc63c5bf265da4d17138c2d?utm_source=gold_browser_extension)