一、OSI模型和TCP/IP模型

  • OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型
  • TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务
OSI模型和TCP/IP模型
  • OSI模型
    • 应用层:是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等
    • 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一
    • 会话层:负责建立、管理和终止表示层实体之间的通信会话
    • 传输层:建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层
    • 网络层:通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层
    • 数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测
    • 物理层:实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质
  • TCP/IP模型
    • 应用层:负责处理特定的应用程序细节。简单网络管理SNMP协议,简单网络传输SMTP,域名解析DNS,文件下载FTP协议,远程协助Telnet协议,超文本传输HTTP等等
    • 传输层:主要为两台主机上的应用提供端到端的通信。TCP协议和UDP协议
    • 网络层:处理分组在网络中的活动,比如分组的选路。IP协议等
    • 网络接口层:包括操作系统中的设备驱动程序、计算机中对应的网络接口卡

二、HTTP与TCP/IP

HTTP通信是由TCP/IP协议承载的,因此HTTP协议的需要进行三次握手才能建立连接,经过四次挥手才能断开连接。

2.1 建立连接

  • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认
  • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态
  • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了
TCP/IP建立连接

2.2 断开连接

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
TCP/IP断开连接

2.3 浏览器对同一域名下的并发限制

各版本浏览器对同一域名下的并发连接数有一定限制,具体详情如下:

浏览器 HTTP/1.1 HTTP/1.0
IE 11 6 6
IE 10 6 6
IE 9 10 10
IE 8 6 6
IE 6, 7 2 4
Firefox 6 6
Safari 3,4 4 4
Chrome 4+ 6 6

http协议目前有如下几个版本:

  • HTTP/0.9    HTTP的1991原型版本。这个版本的设计有许多严重的缺陷,几乎没有人在使用了
  • HTTP/1.0    第一个得到广泛应有的HTTP协议,详情见https://tools.ietf.org/html/rfc1945
  • HTTP/1.0+  在1.0版本基础上增加Keep Alive连接,虚拟机支持已经代理连接支持等特性。也称之为1.1的非正式版本,详情见https://tools.ietf.org/html/rfc2068
  • HTTP/1.1    当前比较流行的HTTP协议版本,该版本校正了之前版本的结构设计缺陷,明确了语义,引入了性能优化特性,删除了一些不友好的特性,详情见https://tools.ietf.org/html/rfc2616
  • HTTP/NG    又称HTTP/2.0,该版本重点关注性能的优化,具有二进制分帧,首部压缩,多路复用,服务器推送等新特性。详情见https://tools.ietf.org/html/rfc7540

发展历史图如下:

HTTP发展历史

注:

Google在2012年时推出了自己SPDY协议,该协议优化了HTTP/1.x中的请求延迟,解决了安全性等问题,大部分特性在HTTP/2.0中均已包含进去了

一、HTTP1.0和HTTP1.1的常见区别

HTTP/1.1是目前最广泛应用的协议,它与HTTP/1.0的几个明显在应用上差异如下:

  • 长连接与短连接
    • HTTP/1.0仅支持短连接,即每次请求都要经历一次建立连接(三次握手)的过程,效率很低,有些时候我们看到有些基于HTTP/1.0的协议,使用Connection: keep-alive来打开长连接,这里的HTTP/1.0是通常指HTTP/1.0+,真正的HTTP/1.0协议是没有这个特性的
    • HTTP/1.1默认就是长连接,只要在Keep Alive的时间内,再次发起请求不需要再重新建立一个连接,直接使用上一次建立好的连接进行传输,减少了建立和关闭连接的资源消耗和延迟
  • 缓存控制
    • HTTP/1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准
    • HTTP/1.1引入了更多的缓存控制策略例如ETag,If-Unmodified-Since, If-Match, If-None-Match,Cache-Control等更多可供选择的HEAD头来控制缓存策略
  • 错误通知
    • 在HTTP/1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
  • Host头
    • 在HTTP/1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP/1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
  • 断点续传
    • HTTP/1.1在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content)

总结图:

HTTP/1.0与HTTP/1.1的区别

二、URL

  • URI:统一资源标识符(Uniform Resource Identifier)
  • URL: 统一资源定位符(Uniform Resource Locator)
  • URN: 统一资源名(Uniform Resource Name)

URI = URL + URN

  • URL完整定义:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

举例:

mailto: president@example.com
ftp://ftp.example.com/pub/books.xls
rtsp://www.example.com:554/videos/cook.rmvb
ftp://joe:joepassword@www.joes.com:23/pub/gun;type=5;graphic=6?item=123&mode=test#dog 
  • URL 字符集与转义

由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。URL 不能包含空格。URL 编码通常使用 + 来替换空格

  • URL的最大长度

在HTTP协议中并没规定URL的长度限制,但各个浏览器厂商及Web服务软件是有这个限制的,具体如下:

浏览器最大长度(字节)
IE浏览器 2,083
Firefox65,536
Chrome8,182
Safari80,000

Web服务软件:

Web Service最大长度(字节)备注
Apache8,192
IIS16,384configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryStringsetting.
Nginx1,000client_header_buffer_size 1k
large_client_header_buffers 4 4k/8k

三、常见状态码

  • 100 – 199 信息性状态码
  • 200 – 299 成功状态码
  • 300 – 399 重定向状态码
  • 400 – 499 客户端错误状态码
  • 500 – 599 服务器错误状态码

常见状态码列表:

状态码含义HTTP/1.0是否支持HTTP/1.1是否支持
200OK
206Partial Content
301Moved Permanently
304Not Modified
400Bad Request
403Forbidden
404Not Found
500Internal Server Error
502Bad Gateway
503Service Unavailable
504Gateway Timeout

四、METHOD

HTTP协议定义了一组安全的方法:GET方法和HEAD方法,即这两个方法不会让服务产生新的内容或影响。

常见METHOD列表:

方法名含义HTTP/1.0是否支持HTTP/1.1是否支持
GET获取资源
HEAD获取报文HEAD
POST向服务器提交数据
PUT向服务器提交资源
DELETE请求服务器删除资源
TRACE网络跟踪
CONNECT与PROXY之间的连接管理
OPTIONS查询能力

五、HEAD

HEAD头分为通用HEAD, 请求HEAD, 响应HEAD和实体HEAD四个部分

  • 通用HEAD
HEAD字段 描述 备注
Connection 允许客户端和服务器指定与请求/响应连接有关的选项 HTTP/1.1
Date 创建报文的日期时间 HTTP/1.0、HTTP/1.1
Transfer-Encoding 指定报文主体的传输编码方式 HTTP/1.1
Via 代理服务器的相关信息 HTTP/1.1
Cache-Control 控制缓存的行为 HTTP/1.1
  • 请求HEAD
HEAD字段 描述 备注
From 客户端用户的E-Mail地址 HTTP/1.0、HTTP/1.1
Host 接收请求的服务器的主机名和端口号 HTTP/1.1
Referer 当前请求URI的文档的URL HTTP/1.0、HTTP/1.1
User-Agent HTTP客户端程序的信息 HTTP/1.0、HTTP/1.1
Accept 告诉服务器客户端能接收哪些媒体类型 HTTP/1.1
Accept-Charset 告诉服务器客户端能接收哪些字符集 HTTP/1.1
Accept-Encoding 告诉服务器客户端能接收哪些内容编码 HTTP/1.1
Accept-Language 告诉服务器客户端能接收哪些语言 HTTP/1.1
Authorization Web 认证信息 HTTP/1.0、HTTP/1.1
If-Match 比较实体标记(ETag) HTTP/1.1
If-Modified-Since 比较资源的更新时间 HTTP/1.0、HTTP/1.1
If-None-Match 比较实体标记(与 If-Match 相反) HTTP/1.1
Range 实体的字节范围请求 HTTP/1.1
  • 响应HEAD
HEAD字段 描述 备注
Age 响应持续时间 HTTP/1.1
Server Web Service的名称和版本 HTTP/1.0、HTTP/1.1
Location 客户端重定向至指定 URI HTTP/1.0、HTTP/1.1
Accept-Ranges 服务器可接受的范围类型 HTTP/1.1
Vary 代理服务器缓存的管理信息 HTTP/1.1
WWW-Authenticate 服务器对客户端的认证信息 HTTP/1.0、HTTP/1.1
  • 实体HEAD
HEAD字段 描述 备注
Content-Encoding 对Body执行的编码方式 HTTP/1.0、HTTP/1.1
Content-Language 对Body执行的自然语言 HTTP/1.0、HTTP/1.1
Content-Length Body的长度 HTTP/1.0、HTTP/1.1
Content-Range Body的位置范围 HTTP/1.1
Content-Type Body的媒体类型 HTTP/1.0、HTTP/1.1
Expires Body的过期日期时间 HTTP/1.0、HTTP/1.1
Last-Modified Body的最后一次修改的日期和时间 HTTP/1.0、HTTP/1.1
ETag Body的标记 HTTP/1.1

六、参考文献