HTTP
Network stack
1. Http
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
HTTP三点注意事项:
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
CGI(Common Gateway Interface) 是 HTTP 服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
绝大多数的 CGI 程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI 程序使网页具有交互功能。
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
HTTP 请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
HTTP 状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。
HTTP 状态码的英文为 HTTP Status Code。。也叫Response Code
- 1xx: information
- 2xx: success(200 OK,201 Created,...)
- 3xx: redirect(301 Moved Permanently,...)
- 4xx: client error(400 Bad Request,403 Forbidden,404 Not Found,...)
- 5xx :server error(500 Internal Server Error...)
下面是常见的 HTTP 状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
Content-type——First priority for the browser
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
2. TCP/IP 协议
TCP/IP 是因特网的通信协议。
通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。
在 TCP/IP 内部
在 TCP/IP 中包含一系列用于处理数据通信的协议:
- TCP (传输控制协议) - 应用程序之间通信
- UDP (用户数据包协议) - 应用程序之间的简单通信
- IP (网际协议) - 计算机之间的通信
- ICMP (因特网消息控制协议) - 针对错误和状态
- DHCP (动态主机配置协议) - 针对动态寻址
TCP 使用固定的连接
TCP 用于应用程序之间的通信。
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。
IP 是无连接的
IP 用于计算机之间的通信。
IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。
通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。
IP 负责将每个包路由至它的目的地
IP 路由器
当一个 IP 包从一台计算机被发送,它会到达一个 IP 路由器。
IP 路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。
在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。
TCP/IP
TCP/IP 意味着 TCP 和 IP 在一起协同工作。
TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。
IP 负责计算机之间的通信。
TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。
IP 负责将包发送至接受者。
32 比特 = 4 字节
TCP/IP 使用 32 个比特来编址。一个计算机字节是 8 比特。所以 TCP/IP 使用了 4 个字节。
一个计算机字节可以包含 256 个不同的值:
00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000 ....... 直到 11111111。
现在,你知道了为什么 TCP/IP 地址是介于 0 到 255 之间的 4 个数字。
TCP/IP模型
TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。
- 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
- 网络层:负责路由以及把分组报文发送给目标网络或主机。
- 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
- 应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通信协议。
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的描述下这三次对话的简单过程。
- seq:(sequence number)序号
- ack:(acknowledgement number)确认号
- 标志位:
- SYN :(SYNchronization)同步
- ACK :(ACKnowlegment)确认
- FIN :(FINish)终止
第一次握手:Client将同步标志位SYN置为1(SYN为1就表示要建立连接,连接成功之后该位置会再次被置为0),请求序号seq=x(在所有的字节排列中,申请从哪一个字节开始发送,这个序号就一般表示当前已经发送到哪个序号,服务器同意后将会从下一个序号开始发送,第一次握手只有请求序号没有确认号),并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由同步标志位SYN=1知道Client请求建立连接,确认标志位ACK置为1(这会才有确认标志位,第一次握手并没有确认标志位。当确认标志位为0时,确认号不起作用),ack=x+1(确认序号等于请求序号+1,表示x+1之前的Server都收到了,从Server发送的请求已经收到)。TCP是全双工协议,因此Server有可能也会给Client发送数据,因此Server也会向Client建立连接,Server将同步标志位SYN置为1(Server也要向Client发送请求,因此SYN也要被置为1),seq=y就表示Server给Client发送的数据开始序号。并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:因为连接要是双向的,Server确认后只是Client到Server连通了,因此Client也要确认一下,才能让Server向Client的连接也连通。Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
1、客户端主机C说:“我可以给你发送数据吗?”
2、服务器S说:“可以的,不过我可能也会给你发送数据。”
3、C:“好,那我开始互相发送数据吧。”
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端相互总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
TCP连接因为是全双工的,因此单方面断开连接是不够的。断开了发送,并不能保证不会进行接收,因此需要客户端和服务端双方都有
断开连接的动作
第一次挥手:当数据传输即将完成,客户端向服务端发送Fin=1的请求关闭标志位,代表告诉服务端,这边数据传输即将完成,准备关闭连接
第二次挥手:当服务端收到客户端收到的Fin=1的标志位后,服务端不会立即向客户端发送Fin=1的标志位,而是先发送一个ack=1的应答信息;表达的意思为你方的请求关闭我方已收到,但我方还有数据传输未完成,待我传输完成再告诉你。
第三次挥手:服务端数据传输完成,向客户端发送Fin=1,客户端收到服务端发送的Fin=1时,知道服务端的数据传输完成,可以断开连接。
第四次挥手:客户端收到服务端发送的Fin=1后,还是考虑到网络不稳定等原因,怕服务器端不知道他要断开连接,于是向服务端发送ack=1确认信息进行确认,同时把自身状态设置为time_wait状态,启动计时器。如果服务端没有收到客户端发送的ack,则在计时器结束后会要求客户端再发送一次ack,当服务端收到客户端的ack后,服务端断开连接。客户端在2MLS(2倍报文最大生存时间)后没有收到服务端发送的重传ack请求,则认为服务端已接收到了客户端的ack,客户端断开连接。
TCP ports
80 HTTP
443 TLS
22 SSH
8000,8080,...development(unofficial)
TLS 使用对称和非对称加密的组合,因为这在安全传输数据时提供了性能和安全性之间的良好折衷。
使用对称加密技术,数据使用发送者和接收者都知道的密钥进行加密和解密;通常长度为 128 位,但最好是 256 位(现在认为小于 80 位的任何内容都是不安全的)。对称密码学在计算方面是有效的,但拥有一个公共密钥意味着它需要以安全的方式共享。
非对称加密使用密钥对——公钥和私钥。公钥在数学上与私钥相关,但如果密钥长度足够,从公钥导出私钥在计算上是不切实际的。这允许发送者使用接收者的公钥来加密他们希望发送给他们的数据,但该数据只能使用接收者的私钥解密。
非对称密码学的优点是共享加密密钥的过程不一定是安全的,但公钥和私钥之间的数学关系意味着需要更大的密钥大小。建议的最小密钥长度为 1024 位,首选 2048 位,但这比同等强度的对称密钥的计算强度高出一千倍(例如,2048 位非对称密钥大约相当于 112 位对称密钥)并且使非对称加密对于许多目的来说太慢了。
出于这个原因,TLS 使用非对称加密技术来安全地生成和交换会话密钥。然后,会话密钥用于加密一方传输的数据,以及解密另一端接收到的数据。一旦会话结束,会话密钥将被丢弃。
3. Cookies
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
信息保存的时间可以根据需要设置.
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
sessions
- Cookies are used by the server to implement sessions:
- A pool of data related to an active connection (one browser instance).
- Typically the cookie for an application contains an identifier for a session.
4. URL
Uniform Resource Locator 的缩写,即统一资源定位器,是因特网上用于指定信息位置的表示方法,通过它就能找到网上的某个你要的资源
Typical URL containing a query string is as follows:
https://example.com/over/there?name=ferret
When a server receives a request for such a page, it may run a program, passing the query string, which in this case is name=ferret
, unchanged to the program. The question mark is used as a separator, and is not part of the query string.
?,问号:常用于动态网站,实现不同的参数值而生成不同的页面或者返回不同的结果,例如 WordPress 的动态链接就是/?p=ID,其中的 p 就表示 post 文章,ID 就表示文章的 ID,从而可以通过文章的 ID 来访问不同的文章。当然我们还常用的就是通过问号+任意参数来实现页面的刷新,从而获得最新的页面或者缓存的刷新。
例如:https://i.leiue.com/avatar/?size=100 (访问该链接就可以获得泪雪用户中心默认的用户头像,并且其 size 就是图像像素大小,所以就会是一个 100px 的头像显示)
- State goes in the request
- Resources have names(URLs)
- use HTTP verbs as intended

HTTP/URL research exercises
Research online what the following are and what they do:
- The fragment part of an URL.
举个例子:倘若有个名为 example.html 的文档中包含一个 id 属性值为 myelement 的元素,
那么使用 example.html#myelement 这个 URL 即可直接导航至该元素,该 URL 中的 #myelement 即称为 URL 片段标志符
a URI fragment is a string of characters that refers to a resource that is subordinate to another, primary resource.
The primary resource is identified by a Uniform Resource Identifier (URI), and the fragment identifier points to the subordinate resource.
- The
Accept
header sent by the HTTP client.-
这个“Accept” 头属性能被浏览器用来指定响应的media 类型,表示自己可以接受的类型。
The "Accept" header field can be used by user agents to specify response media types that are acceptable.
Accept: text/html Accept: image/* // General default Accept: */* // Default for navigation requests Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
-
- The
User-agent
header sent by the HTTP client. What does your browser send?- User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
The User-Agent request header is a characteristic string that lets servers and network peers identify the application, operating system, vendor, and/or version of the requesting user agent.
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
- How do you encode a path that contains a space in an URL? (The link to the slides PDF for the first video called "The internet" for this week contains an example. If you hover over the link, it will display the target filename as
The internet.pdf
, but how is it written in the HTML file?) Which other characters are "special" and need to be treated this way in paths?
URLs cannot contain spaces. URL encoding normally replaces a space with a plus (+) sign or with %20.
https://sitebulb.com/folder+path/page.html https://sitebulb.com/folder%20path/page.html
- Which web server is the University of Bristol using for
www.bristol.ac.uk
, according to the headers? Read up online on this server and the organisation of the same name that maintains it.
forfuture@GIRLSdeMacBook-Pro ~ % curl -s -I www.bristol.ac.uk HTTP/1.1 301 Moved Permanently Date: Mon, 25 Apr 2022 22:46:13 GMT Server: Apache Location: https://www.bristol.ac.uk/ Content-Type: text/html; charset=iso-8859-1 Set-Cookie: BIGipServer~UOBWeb~wwwbristol.app~wwwbristol=3841987244.0.0000; path=/; Httponly
Exercises
- Compile and run the application, and test both
localhost:8000
anlocalhost:8000/html
in your browser. Observe both the headers in the developer tools, and the log messages that spring prints out for each request. - Add a method that replies to requests for
localhost:8000/bad
with a HTTP404 NOT FOUND
error. The body of the page can be a simple string with a message of your choice. Stop and restart the application, and check that you get the correct error message when you try and open this page.
package softwaretools.server01; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.http.ResponseEntity; import org.springframework.http.HttpHeaders; @RestController public class Controller { @Autowired ResourceLoader loader; @GetMapping("/") public ResponseEntity<String> mainPage() { HttpHeaders headers = new HttpHeaders(); headers.set(HttpHeaders.CONTENT_TYPE, "text/plain"); return new ResponseEntity<String>("Hello from Spring", headers, 200); } @GetMapping("/html") public ResponseEntity<Resource> htmlPage() { Resource htmlfile = loader.getResource("classpath:web/page.html"); return ResponseEntity .status(200) .header(HttpHeaders.CONTENT_TYPE, "text/html") .body(htmlfile); } @GetMapping("bad") public ResponseEntity<String> badPage() { return ResponseEntity.badRequest().build(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南