前言
HTTP (HyperText Transfer Protocol,超文本传输协议),
web在其基础上进行通信.
1.1 网络基础TCP/IP
通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集.
1.1.1 TCP/IP的分层管理
TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为以下4层:
应用层,传输层,网络层,数据链路层。
数据链路层 (Data Link Layer):
主要协议:Ethernet、PPP(点对点协议)、HDLC、ARP(地址解析协议)。 功能:提供节点之间的帧传输,负责物理地址的管理和错误检测。
网络层 (Network Layer):
主要协议:IP(包括IPv4和IPv6)、ICMP(互联网控制消息协议)、IGMP(互联网组管理协议)。 功能:负责数据包的路由和转发,处理逻辑地址(IP地址)。
传输层 (Transport Layer):
主要协议:TCP(传输控制协议)、UDP(用户数据报协议)、SCTP(流控制传输协议)。 功能:提供端到端的通信服务,确保数据的可靠性和顺序(TCP)或提供快速传输(UDP)。
应用层 (Application Layer):
主要协议:HTTP、HTTPS、FTP、SMTP、DNS等。 功能:为用户和应用程序提供接口,支持网络应用的运行。
1.1.2网络层的地址—IP协议
IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址(Media Access Control Address)网络之间还必须有传送的机制,才能将IP信息包通过一个个的网络传送到目的地。此种传送机制称为IP路由.
TCP位于传输层,提供可靠的字节流服务.
节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。
三次握手策略
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
作用:
可靠的数据传输:
- 通过三次握手可以确保双方都能够正确地接收对方的数据包,从而保证了连接的可靠性。每次握手都是对前面一个步骤的确认。
防止重复发送同一连接: //确保双方都知道连接成功了
- 如果只用两次握手,可能出现这样一种情况:客户端发出的第一个连接请求(SYN)由于网络问题延迟到达服务器,而在延迟期间客户端重新发起了新的连接请求并完成了正常的三次握手过程。此时,延迟的旧请求到达服务器,服务器会误以为是一个新的连接请求而接受并发送SYN-ACK回应。这种情况下,如果只使用两次握手,客户端就会错误地认为连接已经建立,但实际上服务器并不知道这是重复的请求。三次握手可以避免这种情况的发生,因为客户端会在第二次握手后等待对方的确认(ACK),如果未收到则不会认为连接已建立。
确定初始序列号:
- 在三次握手的过程中,客户端和服务器都会发送自己的初始序列号(ISN)。这些序列号用于标识后续数据传输中的数据片段,确保数据的顺序性和完整性。通过三次握手,双方能够确定彼此的初始序列号,为后续的数据传输做好准备。
同步状态信息:
- 在三次握手的过程中,双方还可以同步其他状态信息,如窗口大小等,这对于后续的数据传输非常重要。
综上所述,三次握手机制不仅保证了连接的建立是双方明确同意的结果,而且还确保了连接的可靠性、数据的完整性和有序性。因此,三次握手是TCP连接建立过程中不可或缺的一部分。
1.1.3应用层的标志—DNS服务
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。
URI的格式
1 | protocol :// hostname[:port] / path / [;parameters][?query]#fragment |
URL 编码
URL 只能使用 ASCII 字符集来通过因特网进行发送。
由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。
URL 不能包含空格。URL 编码通常使用 + 来替换空格。
2.1本章重点—HTTP
HTTP协议用于客户端和服务器端之间的通信,是网页的核心,可以说以上协议都是为其服务的
(注意:HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。)
2.1.1HTTP请求报文
HTTP请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的:
1 | POST /user HTTP/1.1 //请求行 |
请求行
get和post区别:
get是以实体的方式得到由请求 URI 所指定资源的信息传递参数长度受限制,因为传递的参数是直接表示在地址栏中
post方式: 用来向服务器发出请求,要求它接收被附在请求后的实体,并把它请求 URI 所指定资源的附加新子项,所以 post 请求可能会导致新的资源的建立和 / 或已有资源的修改。
GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容
请求首段
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容
请求头部由关键字/值对组成,每行一对
Host: 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
Accept(内容协商) : 客户端希望接受的数据类型,比如 Accept:text/xml(application/json)表示希望接受到的是xml(json)类型
Content-Type:发送端发送的实体数据的数据类型。比如,Content-Type:application/x-www-form-urlencoded(用于post传参,且会进行URL转码)||multipart/form-data(文件上传)||text/xml||application/json
cookie: 会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去
HttpOnlyUser-Agent: 产生请求的浏览器类型
Referer: 表示这个请求是从哪个URL过来的
connect: keep-alive: 持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,形成管线化连接。
X-Forwarded-For: client, proxy1,proxy2,proxy3: 最左边(client1)是最原始客户端的IP地址,HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3
remote_addr: 一般情况下Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接
报体信息传输格式
内容编码应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码,提升传输速率
分块传输编码(Chunked Transfer Coding),把实体主体分块的功能在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。
2.1.2HTTP响应报文
HTTP响应报文和请求报文的结构差不多,也是由四个部分组成:
1 | <status-line> //状态行 |
状态行
1xx:信息
100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。
2xx:成功
200 OK 请求成功(其后是对GET和POST请求的应答文档。)
201 Created 请求被创建完成,同时新的资源被创建。
202 Accepted 供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。
3xx:重定向
300 Multiple Choices 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。
301 Moved Permanently 所请求的页面已经转移至新的url。
302 Found 所请求的页面已经临时转移至新的url。
303 See Other 所请求的页面可在别的url下被找到。
304 Not Modified 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。
306 Unused 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。
307 Temporary Redirect 被请求的页面已经临时移至新的url。
4xx:客户端错误
400:Bad Request 服务器未能理解请求。
401 Unauthorized 被请求的页面需要用户名和密码。
402 Payment Required 此代码尚无法使用。
403 Forbidden 对被请求页面的访问被禁止。
405 Method Not Allowed请求中指定的方法不被允许。
406 Not Acceptable 服务器生成的响应无法被客户端所接受。
407 Proxy Authentication Required 用户必须首先使用代理服务器进行验证,这样请求才会被处理。
408 Request Timeout 请求超出了服务器的等待时间。
409 Conflict 由于冲突,请求无法被完成。
410 Gone 被请求的页面不可用。
411 Length Required”Content-Length” 未被定义。如果无此内容,服务器不会接受请求。
412 Precondition Failed 请求中的前提条件被服务器评估为失败。
413 Request Entity Too Large 由于所请求的实体的太大,服务器不会接受请求。
415 Unsupported Media Type 由于媒介类型不被支持,服务器不会接受请求。
416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。
417 Expectation Failed 执行失败。
423 锁定的错误。
5xx:服务器错误
500 Internal Server Error请求未完成。服务器遇到不可预知的情况
501 Not Implemented请求未完成。服务器不支持所请求的功能。
502 Bad Gateway
请求未完成。服务器从上游服务器收到一个无效的响应。
502.1CGI 应用程序超时。
502.2CGI 应用程序出错。
503 Service Unavailable 请求未完成。服务器临时过载或宕机。
504 Gateway Timeout 网关超时。
505 HTTP Version Not Supported 服务器不支持请求中指明的HTTP版本。