一个Web Server就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error信息。
通常用户使用Web浏览器与相应服务器进行通信。
在浏览器中键入“域名"或"IP地址:端口号”,浏览器则先将你的域名解析成相应的IP地址或者直接根据你给出的IP地址向对应的Web服务器发送一个HTTP请求。
这一过程首先要通过TCP协议的三次握手建立与目标Web服务器的连接,然后HTTP协议生成针对目标Web服务器的HTTP请求报文,通过TCP、IP等协议发送到目标Web服务器上。
HTTP协议
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII
形式给出; 而消息内容则具有一个类似MIME
的格式。
MIME
(Multipurpose Internet Mail Extensions)是一种互联网标准,用于标识在互联网上交换的多媒体文件的类型。它的中文翻译为多用途互联网邮件扩展。MIME最初是为了扩展互联网电子邮件的功能而设计的,后来被广泛应用于Web开发和其他互联网应用中。MIME类型是一种字符串标识,用于指示文件的内容类型和格式。
MIME
类型通常由两部分组成,用斜杠分隔。第一部分是主类型(top-level type),表示文件的大类别,例如文本、图像、音频、视频等。第二部分是子类型(sub-type),表示文件的具体类型,例如HTML、JPEG、PNG、MP3、MP4等。例如文本文件:text/plain、text/html、text/css、text/javascript等;图像文件:image/jpeg、image/png、image/gif等。
HTTP是万维网的数据通信的基础。HTTP的发展是由蒂姆.伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF) 进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的RFC 2616,定义了HTTP协议中现今广泛使用的一个版本 -- HTTP 1.1。
概述
HTTP是一个客户端终端(用户)和服务器端(网站) 请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。
我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个”中间层”,比如代理服务器、网关或者隧道(tunnel)。
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中其实并没有规定必须使用它或它支持的层。
事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP 假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口 (默认是80端口) 的TCP连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
工作原理
HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、 协议版本、请求头部和请求数据。
服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是HTTP请求/响应的步骤:
-
客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。 -
发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。 -
服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。 -
释放连接TCP连接
若connection
模式为close
,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection
模式为keepalive
,则该连接会保持一段时间,在该时间内可以继续接收请求; -
客户端浏览器解析HTML内容:
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头, 响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
HTTP协议是基于TCP/IP协议之上的应用层协议,基于请求响应的模式。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
请求报文格式

下面以浏览器访问百度的请求为例
GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Cookie: __bid_n=1879dc153299729a934207; BAIDU_WISE_UID=wapp_1684121762801_335; ZFY=Rxks9sSCnPIkORUAOc7O7zhQJFOpvtk02rMFJyIVNQQ:C; FPTOKEN=JsiPtl1FqJmRcljXPi4Xn9G+M5oRGiwNByeZxHnsvusctfARX2sY3r2ftEvR1jZYoxhtCVxNx7M4wy/U3eBYiZ7VG7qUn8g048nFHis0IGAA4xDUBAIPgxvJKDGm1OUFbKgm5/wKxIYBAmv1CvoKxwQS4fVObH5h5I1Kkhgfhcb5lddQfx7WhTZ7uid/kMQdU8itwMJR+qw2+Yvw0nBYL+gPaJrwwT7XALXc8emXON/pdbifGedNVntxY2TXkPwRF89My3qLtSN5xXv9R1ntouykX5qfn/Q1z/QcADKLdsVM2kq9TGlVBcvXvMpFffZ3XNvn4qtnjkioeJ9w4qMFp9dRX99M2XQm6LVg/RtSbpAIFuTWnT3/t0zT6lmP/X87qMCoFSdFUcqBz/sYBRfdPw==|Ed//EpKbIXUWIyaMWSJGQPoDqip2WtJDhPgMo9HSEOU=|10|0c3e9703287630d023700eb3a5a4fccb; shifen[579024899971_7604]=1689321737; BCLID=9021858364690105001; BDSFRCVID=Jp8OJeC629Wxl9Jf4DAQ7wmg8b6HbV3TH6_nYnCKbCQEbYhYUBhhEG0PnU8g0KFMUp9MogKK3gOTH4PF_2uxOjjg8UtVJeC6EG0Ptf8g0f5; H_BDCLCKID_SF=JnItoI_htK03q5rcbJQEbCCShGRZbTv9WDTm_D_XQ-nSbqcIjMON0j-WhftO5j57KHFe-pPKXbrZDlOo-xbGQtD4MbrP3tv33mkjbnrGfn02OpQE3J0BXt4syP4eKMRnWnnTKfA-b4ncjRcTehoM3xI8LNj405OTbIFO0KJDJCcjqR8ZDjDWDT5P; BIDUPSID=B3832D42FA4D1FDA91567025145671CD; PSTM=1689579495; BAIDUID=B3832D42FA4D1FDA843B9A299A2B843E:FG=1; BD_HOME=1; H_PS_PSSID=36542_38642_38831_39027_39023_38942_38882_38956_39009_39038_38972_38810_38986_38639_26350_39095_39100_38952; BAIDUID_BFESS=B3832D42FA4D1FDA843B9A299A2B843E:FG=1; BCLID_BFESS=9021858364690105001; BDSFRCVID_BFESS=Jp8OJeC629Wxl9Jf4DAQ7wmg8b6HbV3TH6_nYnCKbCQEbYhYUBhhEG0PnU8g0KFMUp9MogKK3gOTH4PF_2uxOjjg8UtVJeC6EG0Ptf8g0f5; H_BDCLCKID_SF_BFESS=JnItoI_htK03q5rcbJQEbCCShGRZbTv9WDTm_D_XQ-nSbqcIjMON0j-WhftO5j57KHFe-pPKXbrZDlOo-xbGQtD4MbrP3tv33mkjbnrGfn02OpQE3J0BXt4syP4eKMRnWnnTKfA-b4ncjRcTehoM3xI8LNj405OTbIFO0KJDJCcjqR8ZDjDWDT5P; BD_UPN=12314753; BA_HECTOR=ag8lah0ha0058h840g8h048o1ib9rv91o; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598
Host: www.baidu.com
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67
sec-ch-ua: "Not.A/Brand";v="8", "Chromium";v="114", "Microsoft Edge";v="114"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
这段HTTP请求报文包含了以下各项:
-
请求行:
GET / HTTP/1.1
,表示使用GET
方法请求根路径/
,使用HTTP/1.1
协议版本。 -
请求头部:
Accept
:表示客户端可以接受的响应内容类型,包括文本、图像、音频、视频等多种类型。Accept-Encoding
:表示客户端可以接受的响应内容编码方式,包括gzip
、deflate
、br
等多种编码方式。Accept-Language
:表示客户端可以接受的响应内容语言,包括中文、英文等多种语言。其中的q值代表权重,即用户对语言的偏好。Cache-Control
:表示客户端要求服务器缓存响应的内容,这里指定为不缓存。Connection
:表示客户端要求的连接模式,这里指定使用持久连接,即在一次TCP连接中可以发送多个HTTP请求。Cookie
:表示客户端发送的Cookie信息,用于在服务器端识别客户端身份。Host
:表示客户端要请求的服务器主机名和端口号。Sec-Fetch-*
:表示客户端使用了安全性增强的Fetch API,用于防止跨站点攻击。Upgrade-Insecure-Requests
:这里取值为1表示客户端要求服务器将HTTP请求升级为HTTPS请求,以提高安全性。User-Agent
:表示客户端使用的浏览器或其他HTTP客户端的类型和版本号。sec-ch-ua
:表示客户端使用的浏览器或其他HTTP客户端的类型和版本号,用于防止跨站点攻击。sec-ch-ua-mobile
:表示客户端使用的设备是否为移动设备。sec-ch-ua-platform
:表示客户端使用的操作系统平台。
注意 请求报文正文部分和头部直接通过空行分开 以标识正文部分
响应报文格式

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0x8b8e772e00000658
Connection: keep-alive
Content-Encoding: gzip
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com;
Content-Type: text/html; charset=utf-8
Date: Mon, 17 Jul 2023 07:39:53 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=36542_38642_38831_39027_39023_38942_38882_38956_39009_39038_38810_38986_38639_26350_39095_39100_38952; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1689579593038918196210056106057417098840
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
这段HTTP响应报文包含了以下各项:
-
状态行:
HTTP/1.1 200 OK
,表示使用HTTP/1.1
协议版本,响应状态码为200
,表示请求成功。 -
响应头部:
-
Bdpagetype
:表示百度页面类型,这里的值为1。 -
Bdqid
:表示百度查询ID,用于跟踪查询请求。 -
Connection
:表示服务器要求客户端使用持久连接,即在一次TCP连接中可以发送多个HTTP请求。 -
Content-Encoding
:表示响应内容的编码方式,这里的值为gzip
,表示使用gzip压缩算法对响应内容进行了压缩。 -
Content-Security-Policy
:表示响应内容的安全策略,用于防止跨站点攻击。 -
Content-Type
:表示响应内容的类型和字符集,这里的值为text/html; charset=utf-8
,表示响应内容为HTML文本,字符集为UTF-8。 -
Date
:表示响应的日期和时间。 -
Server
:表示服务器的类型和版本号,这里的值为BWS/1.1
,表示使用百度Web服务器。 -
Set-Cookie
:表示服务器要求客户端设置Cookie信息,这里包括了三个Set-Cookie
字段:BDSVRTM=0; path=/
:表示设置一个名为BDSVRTM
的Cookie,值为0,路径为根路径。BD_HOME=1; path=/
:表示设置一个名为BD_HOME
的Cookie,值为1,路径为根路径。H_PS_PSSID=
:表示设置一个名为H_PS_PSSID
的Cookie,值为一串数字和下划线,路径为根路径,域名为.baidu.com
。
这些Cookie信息可以帮助服务器在后续的请求中识别客户端身份和状态。
-
Strict-Transport-Security
:表示服务器要求客户端使用HTTPS协议进行通信,并设置了一个最大有效期,这里的值为max-age=172800
,表示最大有效期为两天。 -
Traceid
:表示跟踪ID,用于跟踪请求和响应之间的关系。 -
X-Ua-Compatible
:表示浏览器兼容性模式,这里的值为IE=Edge,chrome=1
,表示使用最新版本的IE和Chrome浏览器进行兼容性处理。
- 响应正文:由于这个响应报文使用了
gzip
压缩算法对响应内容进行了压缩,因此响应正文是经过压缩的HTML文本,需要进行解压缩才能查看。另外,由于这个响应报文使用了分块传输编码(chunked
),因此响应正文的长度是不确定的,需要根据每个分块的长度来进行解析。
注意 响应报文正文部分和头部直接通过空行分开 以标识正文部分
HTTP请求方法
HTTP/1.1
协议中共定义了八种方法(也叫”动作") 来以不同方式操作指定的资源:
GET
:向指定的资源发出“显示”请求。使用GET
方法应该只用在读取数据,而不应当被用于产生“副作用"的操作中,例如在Web Application中。其中一个原因是GET
可能会被网络蜘蛛等随意访问。HEAD
:与GET
方法一样, 都是向服务器发出指定资源的请求。只不过服务器只返回响应头部信息,不传回资源的报文部分,而 GET 请求则返回完整的响应头部和响应体信息。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中”关于该资源的信息”(元信息或称元数据)。HEAD 请求通常用于获取资源的元数据,而不需要获取资源本身的情况下使用,以减少网络带宽的消耗。比如,想要检查一个文件是否存在,只要发个 HEAD 请求就可以了,没有必要用 GET 把整个文件都取下来。再比如,要检查文件是否有最新版本,同样也应该用 HEAD,服务器会在响应头里把文件的修改时间传回来。POST
:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求报文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。PUT
:向指定资源位置上传其最新内容。DELETE
:请求服务器删除Request-URI所标识的资源。TRACE
:回显服务器收到的请求,主要用于测试或诊断。OPTIONS
:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用*
来代替资源名称,向Web服务器发送OPTIONS
请求,可以测试服务器功能是否正常运作。CONNECT
:HTTP/1.1
协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。