网络部分-《图解http》

398 阅读16分钟

写在前面

近两天看完了图解http这本书,之前上计算机网络课程学过的东西也快忘记了,所以打算把计算机网络捡起来。

http也是面试必问得考点,通过这篇文章你将明白以下知识点。

  • 什么是服务器

  • 如何访问服务器

  • web及网络基础

  • 什么是协议,TCP/IP网络协议族的构成。

  • HTTP请求报文和响应报文的组成

  • HTTP状态码的具体含义

文章的开始

一.什么是服务器

1.服务器的作用

如果所有的程序都是单机的,会导致什么后果呢?

1.数据难以共享

2.受计算机配置的影响,运算速度差异巨大

3.个人计算机的安全性堪忧,可能受到恶意程序的影响

有了服务器之后,上面三个问题问题都可以轻松解决

比如王者荣耀这个游戏可以看到对方和队友的信息是为什么呢?这就是因为王者荣耀服务器的作用。游戏的数据是共享的。

2.服务器的含义

服务器在不同的语境下可能表达了不同的含义:

1.一台独立的计算机

2.一个应用程序 绝大部分使用,作为开发者,通常把服务器看作是一个应用程序

3.服务器的特点

无论它是哪个概念,它都至少具有下面的特点

1.能够通过网络,被其他程序访问

2.能够提供一些服务

4.客户端是什么

通常我们认为服务器是一个提供服务的程序,那么客户端就是访问服务器的程序,服务器为客户端服务。如上图的web服务器和王者服务器与对应的客户端。

二.如何访问服务器

服务器程序可能在本机,也可能在远程,它一定运行在某一台计算机上

要在茫茫互联网中访问到服务器程序,就必须通过下面三步:

1.精确的定位到服务器所在的计算机

2.精确定位到计算机中的服务器程序

3.精确定位到程序中的某个功能
通常,我们使用url地址来描述以上3个信息

url统一资源定位符的一般格式如下,有八个部分组成,其中有四项是可选的。

protocol://hostname:port/path?query#hash

  • 协议方案名:使用的协议,选择不同的协议,会导致和服务器之间消息交互格式、连接方式不同,大部分都服务器支持 http 和 https 两种协议。如果选择了服务器不支持的协议,会导致访问失败。

  • 服务器ip地址,可以是 ip、域名。 ip:每台计算机在网络中的唯一编号,127.0.0.1表示本机。 域名:网络中容易记忆的唯一单词,通过DNS服务器可以将域名解析成IP,localhost会被解析为127.0.0.1

  • 登录信息(认证):此项是可选项。指定用户名和密码作为从服务器端获取资源时必要的登录信息(身份认证)

  • port:服务器端口号,0~65535之间的数字,相当于服务器计算机上的房号,使用不同的端口号相当于敲不同房间的门。计算机上的程序可以监听一个或多个端口号,如果访问的端口号有程序被监听,则计算机会将到达的网络访问交给对应的程序来处理 端口号可以不写,使用默认值。 http协议默认值80。 https协议默认值443。

  • 带层次的文件路径path: 一个普通的字符串,该字符串会交给web服务器处理,主要用于定位服务 如果path为/,则表示根路径,如http://www.baidu.com/的path就是/

  • 查询字符串query: 一种特殊格式的字符串,该字符串会交给web服务器处理,主要用于向服务器某个服务传递一些信息 格式为:属性名=属性值&属性名=属性值

  • 片段标识符hash:一个普通的字符串,在浏览器的地址栏中,如果url其他位置的信息保持不变,仅变动hash,浏览器不会重新访问服务器,因此通常用于不刷新的页面内跳转

我们可以看出:

  • hostname是用于精准定位计算机的
  • port是用于精准定位服务器的
  • protocal是用于告诉服务器使用哪种协议进行传输数据
  • path是用于精准定位服务器上的服务的
  • query是在使用服务的时候传递的额外信息,具体看服务器要求
  • hash是一些额外信息,服务器要不要用具体看服务器要求

三.什么是协议,TCP/IP网络协议族的构成。

协议是什么

首先什么是协议,协议是一种规则,不同硬件,操作系统之间的通信。由哪种语言进行通信,怎样结束通信都要事先确定规则,我们就把这种规则称之为协议

tcp/ip是什么

协议中存在各式各样的内容,从电缆规格到ip地址选定方法、寻找异地用户方法、双发建立通信顺序,以及web显示页面需要处理的内容。像这样把互联网相关协议集合起来总称为TCP/IP。关于TCP/IP也有说法认为是tip和ip两种协议;还有一种就是IP协议通信过程中使用到的协议族的统称。

TCP/IP的分层管理

为什么要进行分层管理呢? 分层管理的好处如下:

当互联网协议系统某个地方需要修改的时候就会把整体替换掉,而分层后就可以对每个层次内部进行修改了。层次化后设计也变得相对简单。

TCP/IP协议族分为应用层,传输层,网络层,链路层。发送端从应用层到链路层,接收端从链路层到应用层。

四.HTTP请求报文和响应报文的组成

1.http报文是什么

用于http协议交互的信息被称为http报文1,客户端和服务器端的报文称之为请求端报文和响应端报文。http报文通常分为报文首部和报文主体两部分,最初由空行来划分。通常不一定有报文主体。

2.http首部字段

在《图解http》中,篇幅最长的就是http首部字段,它是http报文的重要组成成分之一,使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等。

无论是请求还是响应都会使用首部字段。首部字段由字段名:字段值构成。有四种首部字段类型。

  • 通用首部字段
  • 请求首部字段
  • 响应首部字段
  • 实体首部字段

后面说的请求头部响应头部就是http报文的首部字段。

3.http请求报文

请求报文和响应报文是相互的,理解了其中一种格式另外一种也就好理解了。关于他们的组成有的说是两种,有的是三种,有说四种,其实他的道理都是一样的。

如果请求报文有两种格式,那么分为请求头(报文首部)和请求体(请求数据)。如果是三种,即请求行,请求头部,请求数据。请求行和请求头部统称为请求体。第四种只是多了一个空行。

  • 请求行包括:请求方法字段、URL字段、HTTP协议版本字段。它们用空格分隔。例如,GET /index.html HTTP/1.1。
  • 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
  • 请求体: post put等请求携带的数据

4.http响应报文

五. HTTP状态码的具体含义

http状态码在响应报文状态行中,状态码的作用是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器是正常处理了请求,还是出现了错误。

1.状态码的类别

状态码是三位数,第一位指定了类别。

2XX 成功

  • 200 OK,表示从客户端发来的请求在服务器端被正确处理
  • 201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立
  • 202 Accepted 请求已接受,但是还没执行,不保证完成请求
  • 204 No content,表示请求成功,但响应报文不含实体的主体部分 -206 Partial Content,进行范围请求

3XX 重定向

  • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
  • 302 found,临时性重定向,表示资源临时被分配了新的 URL
  • 303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
  • 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
  • 307 temporary redirect,临时重定向,和302含义相同

4XX 客户端错误

  • 400 bad request,请求报文存在语法错误
  • 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
  • 403 forbidden,表示对请求资源的访问被服务器拒绝
  • 404 not found,表示在服务器上没有找到请求的资源
  • 408 Request timeout, 客户端请求超时
  • 409 Confict, 请求的资源可能引起冲突

5XX 服务器错误

  • 500 internal sever error,表示服务器端在执行请求时发生了错误
  • 501 Not Implemented 请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务器不支持的某个方法
  • 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
  • 505 http version not supported 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本

六.确保安全的https

1.https的作用

http有许多不足之处,主要有以下三部分

  • 通信时使用明文,内容可能被偷听
  • 不验证通信方的本身,有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能遭到篡改。 https却解决了上面的三个问题

2.如何解决http缺点

  • 通信的加密

加密就分为两种,一种是通信过程中对通信线路加密。通过SSL安全套接层或TLS安全传输层协议加密通信内容,他们建立安全通信线路将整个线路进行加密。另外一种是对http报文内容进行加密。但还是存在被篡改的缺陷。

  • 验证通信方是否伪装

ssl安全套接层不仅提供了加密处理,还提供了一种证书的手段,可以确认通信方。证书由第三方机构颁发。

  • 防止篡改

在了解篡改前,先了解一种技术叫做中间人攻击,文件在传输的过程中可能已经被篡改为其他的内容,在请求或响应的途中,糟攻击者拦截并篡改内容的攻击称之为中间人攻击(MITM)。 防止篡改的方式有两种 1.完美隐私PGP:创建数字签名 2.MD5:由单向函数生成的散列值校验。

3.https的理解

  • https=http+加密+认证+完整性保护
  • https是身披SSL外壳的http

https并不是一种新协议,只是http通信接口部分用SSL和TSL协议代替而已。通常http和tcp直接通信,而https是和ssl通信再ssl和tcp通信。

4.https的使用(重点)

首先我们需要了解一下秘钥的概念

  • 对称加密:即通信的双方都使用同一个秘钥进行加解密,比如特务接头的暗号,就属于对称加密 对称加密虽然很简单性能也好,但是无法解决首次把秘钥发给对方的问题,很容易被hacker拦截秘钥。

  • 非对称加密:

私钥 + 公钥= 密钥对 即用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密 因为通信双方的手里都有一套自己的密钥对,通信之前双方会先把自己的公钥都先发给对方 然后对方再拿着这个公钥来加密数据响应给对方,等到到了对方那里,对方再用自己的私钥进行解密

非对称加密虽然安全性更高,但是带来的问题就是速度很慢,影响性能。

  • 解决方案:

结合两种加密方式,将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

此时又带来一个问题,中间人问题: 如果此时在客户端和服务器之间存在一个中间人,这个中间人只需要把原本双方通信互发的公钥,换成自己的公钥,这样中间人就可以轻松解密通信双方所发送的所有数据。

所以这个时候需要一个安全的第三方颁发证书(CA),证明身份的身份,防止被中间人攻击。

证书中包括:签发者、证书用途、使用者公钥、使用者私钥、使用者的HASH算法、证书到期时间等

但是问题来了,如果中间人篡改了证书,那么身份证明是不是就无效了?这个证明就白买了,这个时候需要一个新的技术,数字签名。

数字签名就是用CA自带的HASH算法对证书的内容进行HASH得到一个摘要,再用CA的私钥加密,最终组成数字签名。

当别人把他的证书发过来的时候,我再用同样的Hash算法,再次生成消息摘要,然后用CA的公钥对数字签名解密,得到CA创建的消息摘要,两者一比,就知道中间有没有被人篡改了。 这个时候就能最大程度保证通信的安全了。

5.https的缺点

前面我们说http存在缺点,同样的https也存在一些不足,当使用SSL的时候,它的处理速度会变慢很多。主要分为以下两种。

  • 通信慢
  • 加密解密处理消耗cpu和内存等硬件资源,处理速度变慢。因此使用https还是http应当根据需要选择。

附加面试题

看了这么多,来两道简单而复杂面试题

在浏览器地址栏中输入一个页面地址,按下回车键后发生了什么?

  • 浏览器将url地址补充完整:没有书写协议,添加上协议

  • 浏览器对url地址进行url编码:如果url地址中出现非ASCII字符,则浏览器会对其进行编码

  • 浏览器构造一个没有消息体的GET请求,发送至服务器,等待服务器的响应,此时浏览器标签页往往会出现一个等待的图标

  • 服务器接收到请求,将一个HTML页面代码组装到消息体中,响应给浏览器

  • 浏览器拿到服务器的响应后,丢弃掉当前页面,开始渲染消息体的html代码。浏览器之所以直到这是一个html代码,是因为服务器的响应头指定了消息类型为text/html

  • 浏览器在渲染页面的过程中,发现有其他的嵌入资源,如CSS、JS、图片等

  • 浏览器使用不阻塞渲染的方式,重新向服务器发送对该资源的请求,拿到响应结果后根据Content-Type做相应处理

  • 当所有的资源都已下载并处理后,浏览器触发window.onload事件

GET 和 POST差异

虽然http协议并没有规定请求方法必须是什么,但随意的请求方法服务器可能无法识别

服务器一般都能识别GET和POST请求,并做出以下的差异化处理

如果是GET请求,不读取请求体,业务数据从path的search或hash中读取 如果是POST请求,读取请求体,业务数据从请求体中获取,关于请求体的格式,不同的服务器、同一个服务器的不同服务要求不同 在浏览器地址栏中输入url地址是不能产生POST请求的,可以使用表单提交产生POST请求

由于服务器对GET和POST处理的差异,造成了GET和POST请求的差异:

1.GET请求一般没有请求体,POST请求有
2.GET请求的业务数据放在地址中,安全性较差(误分享、被偷窥)
3.GET请求传递的业务数据量是有限的,POST是无限的(除非服务器限制)
4.GET请求利于分享页面结果,POST不行
5.在浏览器中刷新或回退页面时,会按照该页面之前的请求方式重新发送请求,如果是GET请求,浏览器会重新发送GET请求;如果是POST请求,浏览器会重新构建之前的消息体数据,通常会弹出提示

文章的末尾

上面六大块由浅入深,大部分都是概念仔细看应该很容易读懂,能够看到这里我想大家都是认真看了的,俺用心写的博客,是不是该留个赞再走呢~

参考:


计网的知识点还有很多很多,下面列举的一些我会在后面的博客里面介绍。

  • 三次握手和四次挥手的详细原理
  • 可靠的协议,TCP有哪些手段保证可靠的交付
  • DNS的作用,DNS详细解析过程,DNS优化原理
  • CDN的作用和原理
  • webSocket协议的底层原理,与http的区别。
  • HTTP1.1,2.0带来的改变
  • HTTP的加密原理,如何开启HTTPS请求,如何劫持HTTPS请求