计算机网络知识梳理,自顶向下——HTTP

最近看了一些书,感觉书里很多东西讲的并不是很详细,看完也只能有个印象。由于我准备从事后台开发方面的工作,因此最近准备把操作系统、计算机网络等方面的知识再理一遍,尤其是一些重点知识,感觉光看书还不够,需要自我总结+查阅资料才能充分消化,听说写博客是个不错的方法,又能强化记忆,ok那就开始吧,每天进步一点点!

先从计算机网络开始。自顶向下,从应用层的http协议开始。

HTTP(hypertext transfer protocol),即超文本传输协议,就是在客户端和服务端之间传输文字、图片、音视频等超文本数据的约定和规范,其运输层采用TCP协议,是当今网页和小程序等实现的核心。

粗略的来讲,通常当用户请求一个web页面时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象(超文本,HTML、图片等)的HTTP响应报文进行相应,然后浏览器解析响应报文,并呈现在用户面前。

HTTP请求响应具体过程

以访问http://www.xxx.com:80/path/index.html为例:

  1. 浏览器从地址栏中解析出域名(主机名),也就是拿到www.xxx.com
  2. 浏览器根据得到的主机名查询出ip地址,比如算出ip为202.43.78.3,(中间可能经过查找host文件(相当于DNS的本地缓存)或去查询dns服务器)
  3. 浏览器解析出端口(http默认为80,https默认为443)
  4. 浏览器发起一条到202.43.78.3端口为80的连接,(ip+端口号确定主机+进程,重建需要经过几次确定相关参数的来回“握手”)。在客户和服务器进程中都会有一个套接字与其相连。
  5. 浏览器发起请求报文,该报文中包含了路径path/index.html
  6. 服务器接收该报文,并进行解析,从其存储器中检索出对象,然后把检索出来的对象进行封装到响应报文中
  7. 服务器返回请求报文
  8. 浏览器关闭连接(其实浏览器和服务器都可以在不通知对方的情况关闭连接)

HTTP报文格式

HTTP报文有两种:请求报文和响应报文。

请求报文

请求报文由三部分组成:

  1. 请求行 request line
    包含3个字段,请求方法、URL以及HTTP版本
  2. 请求头(首部行) header line
  3. 请求体(实体体)entity body
    请求报文格式

请求报文例子:

POST /index.html HTTP/1.1
HOST: www.XXX.com
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0

Username=admin&password=admin

请求行——请求方法字段包括GET、POST、HEAD、PUT、DELETE等,绝大部分的HTTP请求报文使用GET方法。那么各种方法有什么区别哪:

  1. GET方法意思是获取URL指定的资源,使用GET时请求体为空,但可以通过URL传递参数,利用一个?将资源的URL和请求参数隔开,参数之间通过&分隔。因此这种方式使得参数的长度收到了限制,并且与隐私相关的信息也之间暴露在URL中。比如/index.jsp?username=holmofy&password=123123
  2. HEAD方法与GET用法相同,但没有响应体。比如下载前使用HEAD发送请求,通过ContentLength响应字段,来了解网络资源的大小;或者通过LastModified响应字段来判断本地缓存资源是否要更新。
  3. POST 方法一般用提交信息或数据,请求服务器进行处理(例如提交表单或者上传文件)。表单使用POST相对GET来说还是比较隐秘的,而且GET的URL有长度限制,而上传大文件就必须要使用POST了。
  4. PUT:用于向指定资源位置上传其最新内容(原来没有就上传,有就上传并覆盖原来的内容)
  5. DELETE:请求服务器删除Request-URL所标识的资源。

请求行——URL
URL统一资源定位符是URI(统一资源标识符)中最为常见的一种,其通过资源的位置定位资源,也被称为web地址,除了采用如

http://example.org/absolute/path/resource.txt

还可以采用一种相对路径的:

GET /Test.jsp HTTP/1.1
...
Host:www.example.com
...

这种请求的请求头信息中一般有Host值来指定服务器主机
请求行——HTTP版本
后续更新

请求头
请求头通常由一对key: value组合
常见的请求头有:

  1. HOST
    Host用于指定请求资源的主机名和端口号,比如:
Host: www.baidu.com
  1. User-Agent
    用户请求的代理软件,包括用户的操作系统、浏览器等相关的属性,比如:
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
  1. Referer
    代表当前访问的URL的上一个URL,也就是用户是从什么地方跳转到本页面的,比如:
Referer: https://www.baidu.com/
  1. Cookie
    Cookie是个非常重要的请求头,其存在使得HTTP虽然是无状态的,但仍能够识别用户,常用来表示请求者的身份,比如:
Cookie:BAIDUID=AAABBBCCCDDDEEEFFFGGG;BIDUPSID=ZYXWVUOPQRST;PSTM=1494145048;__cfduid=d9a1edfb6fa7a6a21167d12a07558b2551494568096;BD_CK_SAM=1;PSINO=1;BD_HOME=1;H_PS_PSSID=1421_21079_21672_20927;BD_UPN=12314353;sugstore=1
  1. Range
    请求实体内容的一部分,多线程下载时会用到该请求头
  2. Accept
    客户接受什么类型的信息。
  3. Connection
    是否采用长连接(HTTP1.1开始支持长连接)

请求体:使用GET方法时请求体为空,使用POST方法时使用请求体,当用户提交表单时,HTTP客户常常使用POST方法(也常使用GET方法,将参数放在URL中)。

响应报文

响应报文格式
响应报文例子

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <p>this is http response</p>
</body>
</html>

响应报文由三部分构成:

  1. 响应行(状态行) status line
    包含3个字段,协议版本字段、状态码和响应状态信息
  2. 响应头(首部行) header line
  3. 响应体(实体体)entity body

响应行——状态码:
HTTP状态码由三位数字组成,第一位数字定义了相应的类别,有以下五种:

  • 1XX:信息提示。表示请求已被服务器接受,但需要继续处理。
  • 2XX:请求成功。服务器成功的处理了请求。
  • 3XX:客户端重定向。重定向状态码用于告诉客户端,他们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对资源发起请求。
  • 4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或请求了一个不存在的资源。
  • 5XX:服务器出错。

常见的状态码:

  • 200:客户端请求成功。
  • 302:重定向。
  • 404:请求资源不存在。
  • 400:请求语法错误,服务器无法理解。
  • 403:服务器收到请求,但拒绝提供服务。
  • 500:服务器内部错误。
  • 503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。

响应头部:响应头部和请求头部相似,其参数意义由key指出。常见响应头有:

  1. Server
    服务器所使用的Web服务器的名称
  2. Set-Cookie
    向客户设置Cookie。
  3. Last-Modified
    服务器通过该头信息告诉浏览器,资源最后的修改时间。
  4. Location
    服务器通过该头信息告诉浏览器去访问那个页面,浏览器接收到这样的响应信息后,通常会立刻访问Location头所指向的页面。这个头通常配合302重定向状态码使用。
  5. Refresh
    服务器通过Refresh头信息让浏览器定时刷新。比如下面这个头信息定时三秒后,刷新到百度页面。
Refresh: 3;url="http://www.baidu.com"
  1. Cache-Control
    制定客户端对页面的缓存策略。

响应数据:响应数据时报文的主要部分,即它包含了所请求对象的本身(表示为 data data data data …)。值得一提的是,除了客户使用HEAD方法发送请求时服务器响应数据为空外,还可以使用条件GET,仅当满足条件时才返回相应的数据。

参考:

http/第四章 连接管理
HTTP协议报文格式
计算机网络——自顶向下方法

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值