0%

HTTP协议介绍

相关概念介绍:

http是应用层协议,依赖于传输层tcp协议进行传输。
互联网数字分配机构(IANA,The Internet Assigned Numbers Authority)规定了不同应用的端口使用范围:
0-1023:永久分配给固定应用使用,特权端口,只有管理员能够启动应用进行监听;
1024-41951: 注册端口,分配给某应用使用。
41952+: 客户端程序随机使用的端口,称之为动态端口或私有端口。其范围定义在/proc/sys/net/ipv4/ip_local_port_range文件中

BSD Socket:


BSD Socket是IPC(Inter-Process Communication,进程间通信)的一种实现,允许位于不同主机(或同一台主机)上的进程之间进行通信。

按照Socket API分类:(Socket API:封装了内核中socket通信相关的系统调用)

SOCK_STREAM:流式套接字,tcp套接字
SOCK_DGRAM:数据包式套接字,udp套接字
SOCK_RAW:原始套接字(实现于系统核心,除了处理普通的网络报文之外,还可以处理一些特殊协议报文以及操作IP层以及其以上的数据。)其有以下特征:
⇒ 可以处理ICMP、IGMP等网络报报文
端口对SOCK_RAW而言没有任何意义
⇒ 设置IP_HDRINCL选项后,SOCK_RAW可以操作IP头数据,以完成数据传输。接收报文也一样,内核不识别的IP报文会传递给SOCK_RAWW

根据Socket Domain分类:(Socket Domain:套接字所使用的格式)

AF_INET:Address Family,监听在IPv4地址上
AF_INET6:监听在IPv6地址上
AF_UNIX:用于同一主机上不同进程基于socket套接字通讯(如mysql就是通过这种方式,效率比前两者高),这样的socket叫做Unix_SOCK,其监听在”localhost”或”127.0.0.1”地址上。

TCP FSM:TCP有限状态机

TCP Finite State Machine,TCP有限状态机,3次握手 –已建立连接–> 4次断开的详细过程

TCP协议特征:

  • 面向连接的、可靠的传输层协议;
  • TCP协议建立在不可靠的网络层IP协议上,IP不能提供任何可靠机制,TCP的可靠性完全由自己实现;
  • 端到端的通信;
  • 全双工方式传输;(两条虚连接线路)

TCP采用的最基本的可靠性技术:

  • 将数据打包成段,计算校验和(CRC32)
  • 确认与超时重传
  • 排序,将完整数据包打包成段写入逻辑序号,以便恢复
  • 流量控制(即头部滑动窗口大小,window)
  • 拥塞控制,慢启动和拥塞避免算法

HTTP协议介绍:

http全称为hyper text transfer protocol,是一种应用层协议,默认80/tcp。
html:hyper text mark language,超文本标记语言

1
2
3
4
5
6
7
8
9
<html>
<head>
<title>
</title>
</head>
<body>
<a href="http://....">...</a>
</body>
</html>

css:Cascading Style Sheet,层叠样式表,能够控制html的输出样式
js:JavaScript,客户端脚本,通过客户端浏览器进行解析运行,可以实现动态功能

http协议版本:

http/0.9
http/1.0:引入了cache,MIME,method
MIME:Multipurpose Internet Mail Extesion,是一种邮件协议,引入到http协议后使http能够传输非文本数据
method:数据传输的请求方法(如提交表单用到的post方法,获取资源使用的get方法,其他还有head、put、delete、trace、options等)
http/1.1:增强了缓存功能
http/2.0:

http工作模式:

C/S架构,Server/Client
Client端发送http request(http请求报文)
Server端发送http response(http响应报文)
一次http request与http response的过程叫做一次http事务。

web resource(web 资源)分类:

静态资源
无需服务端做额外处理,如:.jpg .png .gif .html .txt .js .css .mp3 .avi等等

动态资源
服务端需要通过执行程序进行处理,发送给客户端程序的执行结果,如:.php .jsp等等

注意!一个页面中展示的资源一般有多个,而默认情况下,每一个资源的获取都需要单独请求,需要单独建立连接、断开连接,这也是为什么需要keepalived的原因。

保持连接(长连接):keepalived
保持客户端与服务器之间的连接,不是每个资源都进行tcp的三次握手四次断开。

非保持连接(短连接):
每个资源的都需要tcp的三次握手四次断开的步骤。(注意四次断开第3步服务器回应客户端断开请求后,不会立即请求与客户端断开,而是等待一段时间,而如果这段时间客户端再次请求了与服务端连接,则会继续使用此虚连接)

URL,资源标识符

Uniform Resource Locator,用于描述服务器某资源的位置
格式:Scheme://Server_IP[:Port][/PATH]
基本语法
<scheme>://<user>:<password>@<host>:<port>/<path><params>?<query>#<frag>
<params>:参数值传递。如:http://www.grub2.com/bbs/hello;gender=f
?<query>:查询语句使用到的变量值传递。如:http://www.grub2.com/bbs/search?username=tom&title=abc
#<frag>:传递本页锚定标识

类型
相对URL,一般在本地站点资源 的引用时使用,避免由于站点域名改变等而导致资源无法访问;
绝对URL,一般在其他站点资源的引用时使用。

HTTP协议特征 :

stateless:无状态追踪
在未设置”KeepAlive On”时,由于每个资源都需要经过tcp的”三次握手四次断开”,所以服务器无法持续追踪访问者来源,即不能判断不同请求是否由同一客户端发出。即使设置了”KeepAlive On”之后,由于”KeepAliveTimeout 15”的设置,服务器也不可能花费太多时间与一个客户端保持持久连接,而连接一旦断开,依旧无法分辨客户端是谁。而假如是需要登录才能访问的资源,这种情况将反复提示用户输入账号信息。

使用cookie识别客户端:
为了使服务器识别不同的客户端,服务端会在客户端留下一些记录信息,后续访问时,客户端将cookie信息发给服务端,服务器便能够识别了。

另外cookie还有胖cookie与瘦cookie的分别,胖cookie记录了用户的浏览记录等大量信息,而瘦cookie仅记录客户端标识信息,配合客户端的session来 保存用户信息。

服务端session:
关联至客户端cookie。动态网站用于保存客户端状态信息的。

HTTP事务:

http协议的一次请求与响应的过程。理解http事务及http报文语法格式,以便对报文进行分析后,进行不同的操作。
http request报文格式

1
2
3
4
<method><request-URL><version>
<headers> ...
空行
<entity-body>

常见method

1
2
3
4
5
6
7
8
#method   #请求方法,标明客户端希望服务器端对资源的执行动作
GET #从服务器获取一个资源;这时<entity-body>部分通常为空
HEAD #请求只从服务器获取资源响应首部,而不需要服务器端发送<entity-body>
POST #向服务器发送要处理的数据,而这些数据都是存放在<entity-body>中的
PUT #将请求的主体部分直接存储在服务器上,而不是交给服务器处理,数据在<entity-body>中。这时客户端应该对服务器有存取权限才行。
DELETE #请求删除服务器上的指定资源
TRACE #追踪请求报文到达服务器过程中经过的代理服务器
OPTIONS #请求服务器返回对指定资源支持使用的请求方法

可以使用telnet命令来模拟http request请求:

1
2
3
4
telnet IP Port
method /URL Version
Host:IP/FQDN
回车

http response报文格式

1
2
3
4
<version><status code><reason-phrase>
<headers> ...
空行
<entity-body>

version格式:
HTTP/<major>.<minor> #如:HTTP/1.1

status code:以三位数字标记请求过程状态码
1xx:
100-101:信息提示
2xx:
200-206:成功
3xx:
300-305:资源重定向
4xx:
400-415:客户端错误
5xx:
500-505:服务端错误


#常见状态码
200 #成功(OK)。请求数据已通过响应报文的entity-body发出。
301 #永久重定向(Moved Permanently)。请求的URL指定资源已被删除;但会通过响应报文的首部指明Location的值,以标明资源现在所处的新位置。
302 #临时重定向。与301类似,但通过响应报文首部指明的Location的值指明的是资源的临时新位置。
304 #客户端发出条件式请求请求获取资源是否发生过修改,而服务器上的资源未发生改变的响应。
401 #需要认证(Unauthorized)。资源存在,需要客户端提供认证信息。
403 #请求被禁止(Forbidden)。权限不足
404 #资源找不到(Not Found)。
500 #服务器内部错误(Internal Server Error)。
502 #代理服务器从后端服务器收到了一条伪响应(Bad Gateway)。

reason-phrase:状态码所标记状态的简短描述

如:200 –> OK 404 –> NOT FOUND

headers:

每个请求/响应报文可包含0或多个headers。每个headers都有名称,后跟冒号 可选空格 值。(多个值空格隔开)

常见首部:

#通用首部
#可以用在请求/相应报文首部
Date #报文创建时间
Connection #连接状态,如keep-alive、close
Via #报文经过的中间节点
Cache-Control #控制缓存
Pragma #与http1.0兼容的控制缓存相关

#请求首部
#仅可以用在请求报文首部
Accept #可接收媒体类型
Accept-Charset #可接收编码格式
Accept-Encoding #可接收编码格式,如gzip
Accept-Language #可接收的语言
Client-IP #客户端IP
Host #请求的服务器名称和端口号
Referer #当前请求资源的上级资源,常用来分析网站入口来源
User-Agent #客户端代理,即浏览器类型,可通过此条显示不同网页给客户端

#条件式请求首部   #
  Expect   #期望发送的信息
  If-Modified-Since   #指定时间至今,请求的资源是否发生过修改。
  If-Unmodified-Since   #
  If-None-Match   #本地缓存中存储的资源Etag标签是否不匹配服务器中的资源Etag标签。
  If-Match   #

#安全请求首部   #
  Authorization   #向服务器发送认证信息,如账号密码
  Cookie   #客户端向服务器发送cookie
  Cookie2   #

#代理请求首部   #
  Proxy-Authorization   #向代理服务器认证

#响应首部
#信息类 #
Age #相应持续时长
Server #服务程序名称及版本

#协商首部 #
当某资源有多种表示方法时使用
Accept-Ranges #服务器可接收的请求类型范围
Vary #服务器查看的其他首部列表

#安全响应首部 #
Set-Cookie #向客户端设置cookie
Set-Cookie2 #
WWW-Authenticate #服务端对客户端的质询认证表单

#实体首部
#描述<entity-body>部分
Allow #列出对此资源可使用的请求方法
Location #回应客户端真正的实体位置
Content-Encoding #资源编码格式
Content-Language #
Content-Length #
Content-Location #资源真正的实体位置,与Location一样
Content-Type #返回格式为 major/minor

#缓存相关 #
Etag #资源扩展标签
Expires #资源过期时间
Last-Modified #最后修改时间

#扩展首部

entity-body:

真正的数据部分,可能为空。如请求方法为GAT时,通常都为空。