最近看了一些书,感觉书里很多东西讲的并不是很详细,看完也只能有个印象。由于我准备从事后台开发方面的工作,因此最近准备把操作系统、计算机网络等方面的知识再理一遍,尤其是一些重点知识,感觉光看书还不够,需要自我总结+查阅资料才能充分消化,听说写博客是个不错的方法,又能强化记忆,ok那就开始吧,每天进步一点点!
先从计算机网络开始。自顶向下,从应用层的http协议开始。
HTTP(hypertext transfer protocol),即超文本传输协议,就是在客户端和服务端之间传输文字、图片、音视频等超文本数据的约定和规范,其运输层采用TCP协议,是当今网页和小程序等实现的核心。
粗略的来讲,通常当用户请求一个web页面时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象(超文本,HTML、图片等)的HTTP响应报文进行相应,然后浏览器解析响应报文,并呈现在用户面前。
HTTP请求响应具体过程
以访问http://www.xxx.com:80/path/index.html为例:
- 浏览器从地址栏中解析出域名(主机名),也就是拿到www.xxx.com
- 浏览器根据得到的主机名查询出ip地址,比如算出ip为202.43.78.3,(中间可能经过查找host文件(相当于DNS的本地缓存)或去查询dns服务器)
- 浏览器解析出端口(http默认为80,https默认为443)
- 浏览器发起一条到202.43.78.3端口为80的连接,(ip+端口号确定主机+进程,重建需要经过几次确定相关参数的来回“握手”)。在客户和服务器进程中都会有一个套接字与其相连。
- 浏览器发起请求报文,该报文中包含了路径path/index.html
- 服务器接收该报文,并进行解析,从其存储器中检索出对象,然后把检索出来的对象进行封装到响应报文中
- 服务器返回请求报文
- 浏览器关闭连接(其实浏览器和服务器都可以在不通知对方的情况关闭连接)
HTTP报文格式
HTTP报文有两种:请求报文和响应报文。
请求报文
请求报文由三部分组成:
- 请求行 request line
包含3个字段,请求方法、URL以及HTTP版本 - 请求头(首部行) header line
- 请求体(实体体)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方法。那么各种方法有什么区别哪:
- GET方法意思是获取URL指定的资源,使用GET时请求体为空,但可以通过URL传递参数,利用一个?将资源的URL和请求参数隔开,参数之间通过&分隔。因此这种方式使得参数的长度收到了限制,并且与隐私相关的信息也之间暴露在URL中。比如/index.jsp?username=holmofy&password=123123
- HEAD方法与GET用法相同,但没有响应体。比如下载前使用HEAD发送请求,通过ContentLength响应字段,来了解网络资源的大小;或者通过LastModified响应字段来判断本地缓存资源是否要更新。
- POST 方法一般用提交信息或数据,请求服务器进行处理(例如提交表单或者上传文件)。表单使用POST相对GET来说还是比较隐秘的,而且GET的URL有长度限制,而上传大文件就必须要使用POST了。
- PUT:用于向指定资源位置上传其最新内容(原来没有就上传,有就上传并覆盖原来的内容)
- 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组合
常见的请求头有:
- HOST
Host用于指定请求资源的主机名和端口号,比如:
Host: www.baidu.com
- 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
- Referer
代表当前访问的URL的上一个URL,也就是用户是从什么地方跳转到本页面的,比如:
Referer: https://www.baidu.com/
- 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
- Range
请求实体内容的一部分,多线程下载时会用到该请求头 - Accept
客户接受什么类型的信息。 - 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>
响应报文由三部分构成:
- 响应行(状态行) status line
包含3个字段,协议版本字段、状态码和响应状态信息 - 响应头(首部行) header line
- 响应体(实体体)entity body
响应行——状态码:
HTTP状态码由三位数字组成,第一位数字定义了相应的类别,有以下五种:
- 1XX:信息提示。表示请求已被服务器接受,但需要继续处理。
- 2XX:请求成功。服务器成功的处理了请求。
- 3XX:客户端重定向。重定向状态码用于告诉客户端,他们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对资源发起请求。
- 4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或请求了一个不存在的资源。
- 5XX:服务器出错。
常见的状态码:
- 200:客户端请求成功。
- 302:重定向。
- 404:请求资源不存在。
- 400:请求语法错误,服务器无法理解。
- 403:服务器收到请求,但拒绝提供服务。
- 500:服务器内部错误。
- 503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。
响应头部:响应头部和请求头部相似,其参数意义由key指出。常见响应头有:
- Server
服务器所使用的Web服务器的名称 - Set-Cookie
向客户设置Cookie。 - Last-Modified
服务器通过该头信息告诉浏览器,资源最后的修改时间。 - Location
服务器通过该头信息告诉浏览器去访问那个页面,浏览器接收到这样的响应信息后,通常会立刻访问Location头所指向的页面。这个头通常配合302重定向状态码使用。 - Refresh
服务器通过Refresh头信息让浏览器定时刷新。比如下面这个头信息定时三秒后,刷新到百度页面。
Refresh: 3;url="http://www.baidu.com"
- Cache-Control
制定客户端对页面的缓存策略。
响应数据:响应数据时报文的主要部分,即它包含了所请求对象的本身(表示为 data data data data …)。值得一提的是,除了客户使用HEAD方法发送请求时服务器响应数据为空外,还可以使用条件GET,仅当满足条件时才返回相应的数据。
参考:
http/第四章 连接管理
HTTP协议报文格式
计算机网络——自顶向下方法