所在位置:

HTTP 基础(上)

HTTP 协议是在 TCP/IP 协议族的应用层上定义的,所以 HTTP 属于TCP/IP 协议族的一个子集,这一节我们简单讲一下 TCP/IP 的分层和 TCP 的三次握手策略,其它的 TCP/IP 内容可以参考相关的书籍和文章,最主要还是讲 HTTP 的核心内容: 包括 HTTP 工作原理、HTTP请求方法、HTTP 的返回结果状态

下面简单地记录一些比较重要的概念以方便自己记忆:

TCP/IP 的分层管理

TCP/IP 协议图:

TCP/IP 协议按层次分为以下 4 层:

应用层

应用层决定了向用户提供应用服务时通信的活动。

TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。

HTTP 协议也处于该层。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。

网络层

网络层用来处理在网络上流动的数据包,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)

IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。

IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

链路层

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)

数据的封装

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。

这种把数据信息包装起来的做法称为封装,如下图所示:

TCP 的三次握手策略

为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略。用 TCP 协议把数据包送出去后,TCP 不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志(flag)—— SYN(synchronize) 和 ACK(acknowledgement)

发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。

TCP首部

tcp有6种标志位:

  • SYN(synchronous建立联机)
  • ACK(acknowledgement 确认)
  • PSH(push传送) FIN(finish结束)
  • RST(reset重置)
  • URG(urgent紧急)

三次握手过程:

第一次握手(SYN=1, seq=x)
  1. 客户端发送一个 TCP的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口(请求同步),并选择序号 seq=x,表明传送数据时的第一个数据字节的序号是 x。(seq是个随机值)

  2. 发送完毕后,客户端进入 SYN_SEND 状态。

第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)
  1. 服务器的TCP收到连接请求报文段后,如同意,则发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号(随机值y),放到seq 域里,同时将确认序号ack设置为客户的 ISN 加1,即 x+1(即回复对方确认收到了序列号为x开始的包,且希望下次的数据从x+1的位置开始)。

  2. 发送完毕后,服务器端进入 SYN_RCVD 状态。

第三次握手(ACK=1,ack=y+1,seq=x+1)
  1. 客户端收到此报文段后再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段ack中发送给对方,并且告诉服务器自己的seq=x+1

  2. 发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP握手结束。

图解三次握手过程:

HTTP 工作原理

HTTP 协议规定,请求从 客户端发出,最后 服务器端 响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

HTTP 协议自身不对请求和响应之间的通信状态进行保存,HTTP/1.1 虽然是 无状态协议,但是可以利用 Cookie 技术 来实现保持状态功能

HTTP 请求方法

HTTP 常用的请示方法有下面的几种:

GET 方法

GET 方法用来请求访问已被 URI 识别的资源

POST 方法

POST 方法用来传输实体的主体

GET 方法和 POST 方法的区别:

  • GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据

  • GET是安全和幂等的,而POST不是幂等的,重复请求可能会带来意想不到的后果

  • GET时默认可以复用前面的请求数据作为缓存结果返回,而 POST 则不会缓存

HEAD 方法

HEAD 方法和 GET 方法一样,只是不返回报文主体部分,用于获取报头

OPTION 方法

OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法

PUT 方法

PUT 方法用来传输文件,但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用 REST(REpresentational State Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法

DELETE 方法

DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源

但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的

HTTP 状态码

HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作,

状态码的常用类别

2XX 成功状态码

  1. 200 表示从客户端发来的请求在服务器端被正常处理了

  2. 201 表示成功请求并创建了新的资源

  3. 204 表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新

  4. 206 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求

3XX 重定向状态码

  1. 301 表示永久性重定向

  2. 302 表示临时重定向,302和301 的状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的

  3. 304 表示该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况,304 状态码返回时,不包含任何响应的主体部分

4XX 客户端状态码

  1. 400 表示请求报文中存在语法错误

  2. 401 表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息

  3. 403 表示拒绝访问服务器

  4. 404 表示服务器无法根据客户端的请求找到资源

5XX 服务器端状态码

  1. 500 表示服务器内部错误,无法完成请求

  2. 503 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求

参考

【上一篇】ranger 工具的使用

【下一篇】HTTP 基础(下)

相关文章