网络编程基础二:深入理解HTTP与HTTPS

前言

在面试过程中,HTTP 被提问的概率还是比较高的。我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大的。

网络编程基础二:深入理解HTTP与HTTPS

URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。

网络编程基础二:深入理解HTTP与HTTPS

URL

基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:协议(例如:http, https, ftp)
  • host:服务器的IP地址或者域名
  • port#:服务器的端口(如果是走协议默认端口,缺省端口80)
  • path:访问资源的路径
  • query-string:参数,发送给http服务器的数据
  • anchor:锚(跳转到网页的指定锚点位置)

一、基本概念

URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:

请求行、请求头部、空行、请求数据

四个部分组成,下图给出了请求报文的一般格式。

网络编程基础二:深入理解HTTP与HTTPS

一个典型的HTTP请求示例:

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUI......

Host (主机和端口号)Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。

Connection:表示客户端与服务连接类型,keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。

Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。

User-Agent:是客户浏览器的名称

Accept:指浏览器或其他客户端可以接受的传输文件类型

  • Accept: */*:表示什么都可以接收。
  • Accept:image/gif:表明客户端希望接受GIF图像格式的资源;
  • Accept:text/html:表明客户端希望接受html文本。
  • Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。

Referer:页面跳转处,表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。

Accept-Encoding:指出浏览器可以接受的编码方式。

Accept-Language(语言种类)指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。

Accept-Charset:指出浏览器可以接受的字符编码。举例:Accept-Charset:iso-8859-1,gb2312,utf-8

Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能

HTTP请求主要分为Get和Post两种方法

  • GET是从服务器上获取数据,POST是向服务器传送数据
  • GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese
  • POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码,

HTTP:HTTP 是超文本传输协议,是一个基于请求与响应,无状态的(什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。),应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,用于从WWW服务器传输超文本到本地浏览器的传输协议。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

网络编程基础二:深入理解HTTP与HTTPS

HTTPS是一种通过计算机网络进行安全通信的传输协议,简单讲是HTTP的安全版即HTTP下加入SSL/TLS层。通常,http直接和tcp通信.当使用ssl时,则演变成先和ssl通信,再由ssl和tcp通讯.so,所谓https其实就是身披ssl保护外衣的http.

二、HTTP与HTTPS有什么区别

1.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,HTTPS为了解决信息安全问题,需要再http上再加入加密处理认证完整性保护等机制,我们把添加了这些机制的http称之为https(http secure)。

2.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

3.HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

三、HTTPS实现原理

HTTPS采用混合机密机制

在对ssl了解之前先了解两种加密技术.

公开**加密使用一对非对称的**.一把私钥一把公钥.私钥不能让任何人知道,公钥任何人都能获得.也就是发送密文一方使用对方的公钥进行加密处理,对方收到被加密的信息后,再使用自己的的私钥进行解密.利用这种方法不需要发送用来解密的私钥,也不必担心**被盗走.

共享**加密(common key crypto system)->也被叫做对称**加密.以共享**方式加密时必须将**也发给对方.

在互联网上转发**时,若果通信被监听那么**就会落入攻击者之手,另外还得设法安全的保管接收到的**.

所以应充分利用两者各有的有事,将多种方法组合起来用于通信.在交换**环节适用公开**加密方式,之后的建立通信交换报文阶段则适用共享加密方式.

网络编程基础二:深入理解HTTP与HTTPS

 

数字证书

客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

这就存在些问题,如何保证公钥不被篡改和信任度?即服务器给客户端发送自己的公开**时,如何证明客户端收到的公开**就是真实的呢?所以这里就需要借助第三方权威机构 CA (数字证书认证机构),将服务器公钥放在数字证书(由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。

网络编程基础二:深入理解HTTP与HTTPS

公钥和私钥都可用于加密和解密

公钥和私钥都可以用于加解密操作,用公钥加密的数据只能由对应的私钥解密,反之亦然。虽说两者都可用于加密,但是不同场景使用不同的**来加密,规则如下:

1、私钥用于签名、公钥用于验签

签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。

私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。

2、公钥用于加密、私钥用于解密,这才能起到加密作用

因为公钥是公开的,很多人可以持有公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!

若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。

四、面试题

1.状态码   http状态码是在响应报文中出现的,表示此次响应的状态,大致可划分为

  • 1XX:请求接收成功,需要继续处理
  • 2XX:请求接收成功,并且服务端已经进行处理
  • 200:请求已经成功,会返回响应的数据
  • 3XX:重定向,即URL发生了改变
  • 301:永久重定向,即URL已经发生了改变
  • 302:临时重定向,即URL只是暂时发生改变
  • 304:请求的网页没有发生改变,可以直接从缓存服务器中取资源
  • 4XX:请求发生了错误    401:请求需要进行验    403:页面访问被禁   404:请求的资源不存在
  • 5XX:服务端发生了错误   500服务器内部错误   503服务器正忙

2.cookie

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),来对数据进行保存。

实现原理是客户端第一次发送请求后,服务端响应时会在响应头中添加一个set-cookie信息,要求客户端保存cookie信息,客户端在下次请求时,会将这个cookie信息自动发送给服务端,服务端接收后就会根据cookie信息进行匹配。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie是客户端技术,而HttpSession是服务器端技术。

3.Session

Session技术:服务器端会话技术,Session是服务器和客户端建立连接时添加的一个客户端连接标志技术。

 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie用于标记一个会话(session),这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。

4.Cookie和Session的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:将登陆信息等重要信息存放为session    其他信息如果需要保留,可以放在cookie中

5.在浏览器中输入www.baidu.com后执行的全部过程【重点】

客户端浏览器通过DNS解析到www.baidu.com的IP地址xxx,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到IP服务器,然后通过TCP建立传输连接,浏览器发出HTTP请求报文,服务器回复HTTP响应报文,浏览器解析响应报文,并显示在Web页上。收发报文结束,释放TCP连接。

 

文章参考:https://www.toutiao.com/a6749816291009233416/