一:基础知识
众所周知,大多数网络通信的协议,底层都是
socket
套接字,大多数走的是TCP协议,HTTP协议也不例外。下面,就写几个例子来演示一下C/S ==> B/S的演化过程
演化过程
1.最初的版本 - 客户端与服务端
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
conn, addr = s.accept()
data = conn.recv(1024)
conn.send(b'Hello')
print(data.decode('UTF-8'))
conn.close()
s.close()
客户端.py
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
client.send('Hello'.encode('UTF-8'))
data = client.recv(1024)
print(data.decode('UTF-8'))
client.close()
2.浏览器版本1 - 接收浏览器发送的数据
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen()
conn, addr = s.accept()
data = conn.recv(1024)
conn.send(b'Hello')
print(data.decode('UTF-8'))
conn.close()
s.close()
谷歌浏览器 输入IP地址和端口号
127.0.0.1:8080
浏览器发起请求 - 此处可以看出请求里面的所有内容
浏览器的页面 - 无法显示服务器端发来的内容
3.浏览器版本2 - 发送数据到浏览器
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
while True:
conn, addr = s.accept()
print('=======>', addr)
data = conn.recv(1024)
print(data.decode('UTF-8'))
conn.send('HTTP/1.1 200 OK
Hello'.encode('UTF-8')) # 按照HTTP协议特定的格式传输数据
conn.close()
s.close()
HTTP的传输格式
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
k1:v1
k2:v2
k3:v3
Hello
浏览器页面 - 可以显示服务端发来的内容
4.浏览器版本3 - 发送更多格式的数据到浏览器
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
while True:
conn, addr = s.accept()
print('=======>', addr)
data = conn.recv(1024)
print(data.decode('UTF-8'))
conn.send('HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
'.encode('UTF-8'))
with open('content.txt', mode='rb') as f:
for line in f:
conn.send(line)
conn.close()
s.close()
content.txt - 将要发送的内容放进一个文件中
<h1>Hello World</h1>
<p style="color:rgba(255,104,104,0.7);">你好呀!</p>
浏览器页面 - 可以显示服务端发送的内容,并且可以显示样式
5.浏览器版本4 - 直接打开html
文件
将上面的content.txt
重命名为content.html
,然后直接用浏览器打开
互联网知识
1.什么是互联网?
互联网 = 物理连接介质 + 互联网协议
2.互联网建立的目的是什么?
数据传输打破地域限制,否则的话,想获得对方主机上的数据,只能拿着硬盘去对方主机拷贝。
3.什么是上网?
用户上网的过程即浏览器向服务端发送请求,然后将服务端主机的文本文件下载到本地显示的过程。而浏览器与服务器之间走的HTTP协议。
二:HTTP介绍
1.什么是HTTP协议?
HTTP就是Hyper Text Transfer Protocol(超文本传输协议)
是用于从(WWW:World Wide Web,简万维网 )服务器传输超文本到本地浏览器的传送协议。
用来规定服务端和浏览器之间的数据交互的格式。
2.一定要遵循HTTP协议吗?
该协议可以不遵循,但是服务端就不能被浏览器正常访问,只能自己跟自己玩。
但是你就可以自己写个客户端 客户想要使用 就下载你专门的app即可
3.HTTP协议是什么架构?
B/S架构
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求Request。
Web服务器根据接收到的请求后,向客户端发送响应信息Response。
4.HTTP协议是如何传递数据的?
HTTP协议是基于TCP/IP
通信协议来传递数据的(HTML 文件, 图片文件等)
5.HTTP有哪些版本?
① HTTP / 0.9
第1个HTTP协议诞生于1989年3月,
已过时
。
组成:
1.只允许客户端发送GET这一种请求
2.不支持请求头。
3.由于没有请求头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。
无状态性:
1.HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。
详细解释如下:
一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。
2.由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。
HTTP 0.9协议文档:
https://www.w3.org/Protocols/HTTP/AsImplemented.html
② HTTP / 1.0
HTTP/1.0是HTTP协议的第2个版本,至今仍被
广泛采用
。
首次在通讯中指定版本号,相对于HTTP 0.9 增加了如下主要特性
1.支持请求头与响应头
2.Response响应以一个响应状态行开始,Response包含的内容不只限于超文本
3.开始支持客户端通过POST方法向Web服务器提交数据,并支持GET、HEAD、POST方法
4.支持长连接Keepalive(但默认还是使用短连接)
5.缓存机制以及身份认证
③ HTTP / 1.1
HTTP/1.1是HTTP协议的第3个版本,是目前
主流
的HTTP协议版本。
HTTP 1.1引入了许多关键性能优化:keepalive连接
,请求流水线
,chunked编码传输
,字节范围请求
等
1.Persistent Connection(keepalive连接)
1.长连接
允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,以便未来的HTTP请求重用现在的连接,直到客户端或服务器端决定将其关闭为止。
2.HTTP1.1对比HTTP1.0?
在HTTP1.0中使用长连接需要添加请求头 Connection: Keep-Alive,而在HTTP 1.1 所有的连接默认都是长连接,除非特殊声明不支持( HTTP请求报文首部加上Connection: close )
2.Pipelining(请求流水线)
A client that supports persistent connections MAY "pipeline" its requests
(i.e., send multiple requests without waiting for each response).
A server MUST send its responses to those requests in the same order that the requests were received.
支持持久连接的客户端可以“流水线”它的请求(即,发送多个请求而无需等待每个响应)。
服务器必须按照与收到请求的相同顺序来向这些请求发送响应。
3.chunked编码传输
介绍:
该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(比如由数据库动态产生的数据。
传输编码和分块编码:
当响应头里包含Transfer-Encoding: chunked,代表分块编码,会把「报文」分割成若干个大小已知的块,块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了,也意味着不需要写回Content-Length首部了。
分块传输的应用:
当使用持久连接时,在服务器发送主体内容之前,必须计算出主体内容的大小,然后放到响应头里(Content-Length:主体的字节数)发送给客户端。
如果服务器动态创建内容,可能在发送之前无法知道主体大小,分块编码就是为了解决这种情况:服务器把主体逐块发送,说明每一块的大小。
服务器再用大小为0的块作为结束块,为下一个响应做准备,此时响应头里便不再需要Content-Length了
除非使用了分块编码Transfer-Encoding: chunked,否则响应头首部必须使用Content-Length首部。
关于Content-Length
首部:
如果请求头包含Accept-Encoding': 'gzip',则服务端会将内容压缩后返回,内容的Content-Length长度是压缩后的长度,如果请求头不包含Accept-Encoding': 'gzip',
服务器就不会采取gzip压缩,同时我司服务器设定也不进行分块编码。所以返回响应头的Content-Length首部是必须的,但是这个值的大小肯定是没有进行过压缩的文件大小。
4.字节范围请求
HTTP1.1支持传送内容的一部分。比方说,当客户端已经有内容的一部分,为了节省带宽,可以只向服务器请求一部分。
该功能通过在请求消息中引入了range头域来实现,它允许只请求资源的某个部分。
在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。
如果服务器相应地返回了对象所请求范围的内容,则响应码206(Partial Content)
HTTP 1.1还新增了如下特性:
1.请求消息和响应消息都应支持Host
头域在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。
但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。因此,Host头的引入就很有必要了。
2.新增了一批Request method
HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT方法
3.缓存处理
HTTP/1.1在1.0的基础上加入了一些cache的新特性,引入了实体标签,一般被称为e-tags,新增更为强大的Cache-Control头。
④ HTTP / 2.0
HTTP 2.0是下一代HTTP协议,目前应用还
非常少
。
主要特点有:
1.多路复用(二进制分帧)
HTTP 2.0最大的特点: 不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。
而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
2.头部压缩
当一个客户端向相同服务器请求许多资源时,像来自同一个网页的图像,将会有大量的请求看上去几乎同样的,这就需要压缩技术对付这种几乎相同的信息。
3.随时复位
HTTP1.1一个缺点是当HTTP信息有一定长度大小数据传输时,你不能方便地随时停止它,中断TCP连接的代价是昂贵的。
使用HTTP2的RST_STREAM将能方便停止一个信息传输,启动新的信息,在不中断连接的情况下提高带宽利用效率。
4.服务器端推流:Server Push
客户端请求一个资源X,服务器端判断也许客户端还需要资源Z,在无需事先询问客户端情况下将资源Z推送到客户端,客户端接受到后,可以缓存起来以备后用。
5.优先权和依赖
每个流都有自己的优先级别,会表明哪个流是最重要的,客户端会指定哪个流是最重要的,有一些依赖参数,这样一个流可以依赖另外一个流。
优先级别可以在运行时动态改变,当用户滚动页面时,可以告诉浏览器哪个图像是最重要的,你也可以在一组流中进行优先筛选,能够突然抓住重点流。
6.HTTP的4个特性
特点 | 描述 |
---|---|
基于请求/响应 | 一次请求,对应一次响应 |
基于TCP/IP协议 | HTTP协议是应用层协议,基于TCP传输层协议以及IP网络层协议 |
无连接 | 请求来一次,响应一次,之后就再也没有任何链接和关系了 (注意,1.1版本后支持长链接) |
无状态 | 不会保存用户的信息 |
三:HTTP的请求 - Request
1.请求的URL
① 什么是URI?
URI(Uniform Resource Identifiers),HTTP使用URI来传输数据和建立连接。
② 什么是URL?
URL(Uniform Resource Locator),中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。
③ URL的组成部分
以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.xuexianqi.top:80/archives/286.html?name=root&pwd=123#top1
部分 | 参数 | 作用 | 是否必须 |
---|---|---|---|
协议 | http:// |
代表网页使用的是HTTP协议。 在Internet中可以使用多种协议,如HTTP,FTP等等 |
是 但是浏览器会自动补全 |
域名 | www.xuexianqi/top |
解析到真实的IP地址 也可以直接填写IP地址 |
是 |
端口号 | 80 |
跳转到对应的端口号的应用程序http 默认端口为80 https 默认端口为442 |
否 |
虚拟目录 | archives |
虚拟目录部分,一般用于分类 | 否 |
文件名 | 286.html |
读取域虚拟目录下的某一个文件 | 否 |
参数 | ?name=root&pwd=123 |
携带搜索和查询的内容 参数可以用多个 & 连接 |
否 |
锚点 | #top1 |
用于定位到页面中的某一个部分 | 否 |
④ URI、URL、URN
URI:
uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的。
URI一般由三部组成:
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源
URL:
uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
URN:
uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。
URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。
这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。
而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。
相反的是,URL类可以打开一个到达资源的流。
2.Request请求的格式
请求的消息格式分为3个部分:请求首行
、请求头
、请求体
。
请求头和请求体中间有一个空行
,用于分隔
请求头和请求体。
部分 | 全拼 |
---|---|
请求首行 | Request Head |
请求头 | Header |
空行 | / |
请求体 | Request Body |
示例数据:
GET /archives/286.html HTTP/1.1
Host: www.xuexianqi.top
Connection: keep-aliveDNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
① 请求首行
用来说明请求类型,要访问的资源,以及所使用的HTTP版本。
GET
表示发送的请求是GET请求
/archives/286.html
表示要访问的资源
HTTP/1.1
表示当前HTTP协议的版本
② 请求头
从第二行起为请求头部,紧接着请求行(即第一行)之后,用来说明服务器要使用的附加信息。
HOST将指出请求的目的地。
User-Agent
,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础。
该信息由你的浏览器来定义,并且在每个请求中自动发送等等。
③ 空行
请求头部后面的空行是必须的。
用于分隔请求头与请求体,让浏览器容易辨别。
④ 请求体
这个例子中,请求体为空,只有POST请求才有请求体!
可以用浏览器登录一个网站,输错账号密码来抓取POST请求。
四:HTTP的请求方法
1.HTTP定义的与服务器交互的方法
HTTP1.0
定义了3种请求方法:GET
、POST
、HEAD
HTTP1.1
增加了5种请求方法:OPTIONS
、PUT
、DELETE
、TRACE
、CONNECT
2.各个方法的作用
请求 | 作用 |
---|---|
GET | 请求指定的页面信息,并返回实体主体 |
HEAD | 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求 (例如提交表单或者上传文件) 数据被包含在请求体中 POST请求可能会导致新的资源的建立或已有资源的修改 |
OPTIONS | 允许客户端查看服务器的性能 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
DELETE | 请求服务器删除指定的页面 |
TEACE | 回显服务器收到的请求,主要用于测试或诊断 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
3.常用的请求
请求 | 对资源的操作 |
---|---|
PUT | 增 |
DELETE | 删 |
POST | 改 |
GET | 查 |
4.最常用的请求
GET —— 用于获取/查询资源信息
POST —— 用于更新资源信息
5.GET请求
与POST请求
的区别
GET请求
GET
请求是HTTP
协议中众多请求方式的一种,也是HTTP
协议默认的请求方式
3个特点:
1.
没有请求体
2.数据必须控制在
1KB之内
3.请求数据会暴露在地址栏中(
?
之后,以&
进行分割)
触发GET请求的3个情况:
1.地址栏
直接输入网址
2.点击页面
<a>
标签进行链接跳转
3.
<form>
表单默认提交方式method
属性为GET,也可以指定为POST
POST请求:
POST
请求最大的优势就是不在地址栏暴露数据,此外它还有4个特点
1.数据
不会出现在地址栏中
2.数据的大小
没有上限
3.
有请求体
4.请求体中如果存在
中文
,将使用URL进行编码
区别 | GET请求 | POST请求 |
---|---|---|
参数组织方式不同 | 数据会放在URL中,用? 分割,用& 连接 |
把数据放在HTML 的body 中 |
传输数据大小不同 | 有限制,1K 以内 |
无限制,只受限于服务端 |
安全性 | 安全性低 | 安全性高 |
五:HTTP的响应 - Response
服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息Response
1.HTTP响应的格式
响应也分成4个部分:响应状态码、消息报头、空行、响应体
部分 | 全拼 |
---|---|
响应首行 | Response Head |
响应头 | Header |
空行 | / |
响应体 | Response Body |
① 响应首行
包括HTTP版本和响应状态码
② 响应头
用来说明客户端要使用的一些附加信息
③ 空行
请求头部后面的空行是必须的。
用于分隔响应头与响应体,让浏览器容易辨别。
④ 响应体
服务器返回给客户端的文本信息,也就是用户可以看到的内容。
2.HTTP的响应状态码
状态代码有3位数字
组成,第1个数字定义了响应的类别
,共分5种类别
类别 | 状态 | 描述 |
---|---|---|
1XX | 信息 | 服务器收到请求,需要请求者继续执行操作 |
2XX | 成功 | 操作被成功接收并处理 |
3XX | 重定向 | 需要进一步的操作以完成请求 |
4XX | 客户端错误 | 请求包含语法错误或无法完成请求 |
5XX | 服务端错误 | 服务器在处理请求的过程中发生了错误 |
3.HTTP状态码列表
1XX
状态码 | 英文名称 | 描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
2XX
状态码 | 英文名称 | 描述 |
---|---|---|
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
3XX
状态码 | 英文名称 | 描述 |
---|---|---|
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请 |
4XX
状态码 | 英文名称 | 描述 |
---|---|---|
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
5XX
状态码 | 英文名称 | 描述 |
---|---|---|
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
六:HTTP协议完整的工作流程
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。
HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。
服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
1.客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2.发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3.服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4.释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5.客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。
客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5.释放 TCP连接;
6.浏览器将该 html 文本并显示内容;