处于协议栈顶层的应用层协议定义了运行在不同端系统的应用程序进程如何相互传递报文。定义内容如下:

  1、交换的报文类型。请求报文和响应报文。

  2、各种报文类型的语法,如报文中的各个字段及这这些字段是如何描述的。

  3、字段的语义,即这些字段中包含的信息的含义。

  4、一个进程何时以及如何发送报文,对报文进行相应的规则。

  Web的应用层协议是超文本传输协议(HTTP)。HTTP由两个程序实现:一个客户程序和一个服务器程序;客户程序和服务器程序运行在不同的端系统中,通过HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的形式。

  HTTP使用TCP作为它的支撑运输协议(非UDP)。HTTP客户首先发起一个与服务器的TCP连接。一旦建立连接,该浏览器和服务器进行就可以通过套接字接口访问TCP。

  服务器像客户端发送被请求的文件,而不存储任何关于该客户的状态信息,因此HTTP协议是无状态协议。

  另外HTTP协议还有一个特点:非持续连接和持续连接

  非持续连接:

  从服务器像客户传送一个Web页面的步骤。假设该页面含有一个HTML基本文件和10个PNG图形,并且这11个对象位于同一台服务器上。

  例如客户端请求URL:http://www.baidu.com/login.do(该url是随意模拟,此处只供实例,接口也是随意模拟)

  1、HTTP客户进行在端口号80发起一个到服务器www.baidu.com的TCP连接,该端口号是HTTP的默认端口。在客户和服务器上分别有一个套接字与该连接相关联。

  2、HTTP客户经它的套接字向该服务器发送一个HTTP请求报文。请求报文中包含了路径名/login.do,

  3、HTTP服务器进行经它的套接字接收该请求报文,从其存储器(RAM或磁盘)中检索出对象www.baidu.com/login.do,在一个HTTP响应报文中封装对象,并通过其套接字向客户发送响应报文。

  4、HTTP服务器进程通知TCP断开TCP连接(TCP确认客户已经完成的收到响应报文为止)

  5、HTTP客户接收响应报文,TCP连接关闭。该报文指出封装的对象是一个HTML文件,客户从响应报文中提出该文件,检查该HTML文件,得到10个PNG图形引用

  6、对每个引用的PNG图形对象重复前四个步骤

  这便是非持续连接的使用过程,其中每个TCP连接在服务器发送一个对象关闭,即该连接并不为其他的对象而持续下来。值得注意的是每个TCP连接只传输一个请求报文和一个响应报文。因此该案例中,当用户请求该Web页面时,要产生11个TCP连接。

  案例中没有明确用户或者10个PNG图形是使用10个串行的TCP连接,还是某些PNG对象使用了并行的TCP连接。当然在默认情况下,大部分浏览器打开5~10的并行TCP连接,而每条连接处理一个请求响应事务。使用并行连接可以缩短响应时间。

  (具体的TCP连接后续记录)

  持续连接的HTTP:

  持续连接情况下,服务器在发送响应之后保持TCP连接打开。在相同的客户与服务器之间的后续请求和响应报文能够通过相同的连接进行传送。

  如上案例,10个PNG图形对象可以使用单个持续TCP连接进行传送。更牛逼的是,位于同一台服务器的多个web页面在从该服务器发送给同一个客户时,可以在单个持续TCP连接进行。当然连接经过一定的时间间隔便会关闭该连接。

  HTTP请求报文结构:

  

  具体实际报文可通过抓包工具fiddler、wireshark等抓取学习。

  请求行:方法字段、URL字段和HTTP版本字段

      方法字段有:GET:从指定的资源请求数据

            PUT:向指定的资源修改数据

            HEAD:类似与GET方法。当服务器收到使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但并不是返回请求对象。

            POST:向指定的资源提交要被处理的数据

            DELETE:向指定的额资源删除数据

        

  请求头包含:HOST、connection、User-agent、Accept-language、cookie等(皆以键值对形式展现)

  HTTP响应报文结构:

  

  状态行:协议版本字段、状态码、相应状态信息。

  响应头:Connection、Date、Server、Content-Length、Content-type、Last-Modified(键值对形式)

  响应数据

  常见状态码: 

1xx - 信息提示

这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。 • 100 - 继续。

• 101 - 切换协议。

2xx - 成功

这类状态代码表明服务器成功地接受了客户端请求。 • 200 - 确定。客户端请求已成功。

• 201 - 已创建。

• 202 - 已接受。

• 203 - 非权威性信息。

• 204 - 无内容。

• 205 - 重置内容。

• 206 - 部分内容。

3xx - 重定向

客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。

• 302 - 对象已移动。

• 304 - 未修改。

• 307 - 临时重定向。

4xx - 客户端错误

发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。 • 400 - 错误的请求。

• 401 - 访问被拒绝。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: • 401.1 - 登录失败。

• 401.2 - 服务器配置导致登录失败。

• 401.3 - 由于 ACL 对资源的限制而未获得授权。

• 401.4 - 筛选器授权失败。

• 401.5 - ISAPI/CGI 应用程序授权失败。

• 401.7 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。

• 403 - 禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因: • 403.1 - 执行访问被禁止。

• 403.2 - 读访问被禁止。

• 403.3 - 写访问被禁止。

• 403.4 - 要求 SSL。

• 403.5 - 要求 SSL 128。

• 403.6 - IP 地址被拒绝。

• 403.7 - 要求客户端证书。

• 403.8 - 站点访问被拒绝。

• 403.9 - 用户数过多。

• 403.10 - 配置无效。

• 403.11 - 密码更改。

• 403.12 - 拒绝访问映射表。

• 403.13 - 客户端证书被吊销。

• 403.14 - 拒绝目录列表。

• 403.15 - 超出客户端访问许可。

• 403.16 - 客户端证书不受信任或无效。

• 403.17 - 客户端证书已过期或尚未生效。

• 403.18 - 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。

• 403.19 - 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用

Nginx 499 -- 代理服务端主动关闭客户端连接

HTTP 400 - 请求无效

HTTP 401.1 - 未授权:登录失败

HTTP 401.2 - 未授权:服务器配置问题导致登录失败

HTTP 401.3 - ACL 禁止访问资源

HTTP 401.4 - 未授权:授权被筛选器拒绝

HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败

HTTP 403 - 禁止访问

HTTP 403 - 对 Internet 服务管理器 的访问仅限于 Localhost

HTTP 403.1 禁止访问:禁止可执行访问

HTTP 403.2 - 禁止访问:禁止读访问

HTTP 403.3 - 禁止访问:禁止写访问

HTTP 403.4 - 禁止访问:要求 SSL

HTTP 403.5 - 禁止访问:要求 SSL 128

HTTP 403.6 - 禁止访问:IP 地址被拒绝

HTTP 403.7 - 禁止访问:要求客户证书

HTTP 403.8 - 禁止访问:禁止站点访问

HTTP 403.9 - 禁止访问:连接的用户过多

HTTP 403.10 - 禁止访问:配置无效

HTTP 403.11 - 禁止访问:密码更改

HTTP 403.12 - 禁止访问:映射器拒绝访问

HTTP 403.13 - 禁止访问:客户证书已被吊销

HTTP 403.15 - 禁止访问:客户访问许可过多

HTTP 403.16 - 禁止访问:客户证书不可信或者无效

HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效

HTTP 404.1 -无法找到 Web 站点 HTTP 404- 无法找到文件 


HTTP 405 - 资源被禁止

HTTP 406 - 无法接受

HTTP 407 - 要求代理身份验证

HTTP 410 - 永远不可用

HTTP 412 - 先决条件失败

HTTP 414 - 请求 - URI 太长

HTTP 500 - 内部服务器错误

HTTP 500.100 - 内部服务器错误 - ASP 错误

HTTP 500-11 服务器关闭

HTTP 500-12 应用程序重新启动

HTTP 500-13 - 服务器太忙

HTTP 500-14 - 应用程序无效

HTTP 500-15 - 不允许请求 global.asa

Error 501 - 未实现

HTTP 502 - 网关错误 

用户与服务器的交互:cookie

  cookie的出现解决了HTTP的无状态特点。

  cookie技术四组件:

  1、在HTTP响应报文中的一个Cookie首部行。

  2、在HTTP请求报文中的一个Cookie首部行。

  3、在用户端系统中保留一个Cookie文件,并由用户的浏览器进行管理。

  4、位于Web站点的一个后端数据库。

Session:

  Session机制是一种服务器端的机制,通过session保存状态信息,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

Cookie与Session的区别:

1)Cookie将状态保存在客户端,Session将状态保存在服务器端;

2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。


Web缓存:

  WEB缓存器也叫代理服务器,它是能够代表初始Web服务器来满足HTTP请求的网络实体。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。缓存技术是一个比较大的议题,如今缓存技术已经是百家争鸣,redis、cdn、combo等等,没有做更深的研究,先记一个实例:

  假设浏览器被配置首次请求对象被指定至Web缓存器。请求http://www.baidu.com/login.do

  1、浏览器建立一个到web缓存器的TCP连接,并向Web缓存器中的对象发送一个HTTP请求

  2、Web缓存器进行检查,看看本地是否存储了该对象副本。如果有,Web缓存器就向客户浏览器用HTTP响应报文返回该对象

  3、如果Web缓存器没有该对象,它就打开一个与该对象的初始服务器的TCP连接。Web缓存器则在这个缓存器到服务器的TCP连接上发送一个对该对象的HTTP请求。在收到该请求后,初始服务器像该Web缓存器发送具有该对象的HTTP响应

  4、当Web缓存器接收到该对象时、它在本地存储空间存储一份副本,并向客户的浏览器用HTTP响应报文发送该副本(通过现有的客户端浏览器和Web花村其之间的TCP连接)

因此,Web缓存器既是服务器又是客户。

Web应用层协议---HTTP的更多相关文章

  1. Web应用与应用层协议

    Web应用与应用层协议 本篇博文中的主要参考文献是<计算机网络高级教程>,分别是吴功宜老先生和吴英教授合著.这部教程是我研究生老师所推荐的网络必读科目,由于该教程讲解的基础知识详细,但内容 ...

  2. 第五章Web应用与应用层协议

    Web应用与应用层协议 本篇博文中的主要参考文献是<计算机网络高级教程>,分别是吴功宜老先生和吴英教授合著.这部教程是我研究生老师所推荐的网络必读科目,由于该教程讲解的基础知识详细,但内容 ...

  3. UNIX/Linux网络编程基础:应用层协议简介

    目录 1.HTTP协议 2.FTP协议 3.TELNET协议 4.NFS协议 1.HTTP协议 应用层协议HTTP协议是Web的核心.HTTP协议在Web的客户程序和服务器程序中得以实现,运行在不同系 ...

  4. web网络协议

    一.OSI七层模型   OSI参考模型是国际标准化组织ISO(International Standards Organization )制定的模型,把计算机与计算机之间的通信分成七个互相连接的协议层 ...

  5. 计算机网络Web应用层与运输层(HTTP/TCP)

    应用层协议原理 Web和HTTP DNS:英特网的目录服务 运输层 面向连接的运输:TCP及拥塞原理 一.应用层协议原理 DNS域名解析: (用例:www.baidu.com)域名解析是网络请求的第一 ...

  6. TCP/IP笔记(八)应用层协议

    TCP/IP的应用层涵盖了OSI参考模型中第5.第6.第7层的所有功能,不仅包含了管理通信连接的会话层功能.转换数据格式的标识层功能,还包括与对端主机交互的应用层功能在内的所有功能. 利用网络的应用程 ...

  7. 从websocket协议出发,了解应用层协议,传输层协议,网络的7层协议

    其他关联连接 :TCP的三次握手(建立连接)和四次挥手(关闭连接) 1.websocket是全双工,不同于传统半双工通信 传统的Web应用中,浏览器与服务器交互都是半双工通信(但并不完全是半双工通信, ...

  8. 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP

    MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)最早是IBM开发的一个即时通讯协议,MQTT协议是为大量计算能力有限且工作在低带宽.不 ...

  9. UDS(ISO14229-2006) 汉译(No.7 应用层协议)【未完,待续】

    7.1定义 应用层协议通常作为确认消息的传输,意味着从客户端发送的每一个请求都将有由服务器端产生的与之相对的响应. 唯一的例外在于:例如使用了功能寻址方式,或者该请求/指示没有指定生成响应/确定的少数 ...

随机推荐

  1. DLL声明导出函数的两种方式

    DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport):另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属 ...

  2. Chrome自定义最小字号

    ============= ============== =======================

  3. Linux:Aircrack-ng

    Aircrack-ng 工具主要有 airmon-ng 处理网卡工作模式 airodump-ng 抓包 aircrack-ng 破解 aireplay-ng 发包,干扰 另外还要用到以下 linux ...

  4. mybatis入参方式和缓冲

    1.mybatis入参方式 @Param注解参数(注解) 封装成对象入参 public int updatePassword(@Param("id")int id,@Param(& ...

  5. 基于tensorflow的增强学习

    可以通过下面的连接查看这个项目工程: https://github.com/reinforceio/tensorforce 通过这遍文章来了这个项目的使用: https://reinforce.io/ ...

  6. Java之引用类型分析(SoftReference/WeakReference/PhantomReference)

    引言: 即使对于Java的很多老鸟来说,如果忽然问他引用的类型,大概率是一脸茫然,不知所措的-.Java中的引用还分类型,神马情况??? 本文将针对这些类型进行分析,帮助您一文知所有类型. Java的 ...

  7. JMter请求参数中文显示乱码

    如上图所示,上传的参数为中文的时候,显示不出来,解决方法如下: 1.进入Jmter安装文件bin文件夹,找到文件jmeter.properties 2.在该文件找到jsyntaxtextarea.fo ...

  8. angular2.0学习日记1

    使用NG2之前需要安装node以及Npm环境,并到node下下载ng2所需要得文件,具体配置请到https://angular.cn/docs/ts/latest/quickstart.html按照提 ...

  9. java IO 学习(一)

    io的类有好多个,总结一下,给他们列出来,下一行缩进为子类: File 文件或目录类 InputStream 字节输入流 FileInputStream 用于读取文件的原始字节流,变成字节输入流 By ...

  10. python中处理命令行参数的模块optpars

    optpars是python中用来处理命令行参数的模块,可以自动生成程序的帮助信息,功能强大,易于使用,可以方便的生成标准的,符合Unix/Posix 规范的命令行说明.使用 add_option() ...