应用层
HTTP
诞生背景
- 初衷是为知识共享,提供一种能让远隔两地的研究者们共享知识的途径。
- 基本理念是借助多文档之间相互关联形成的超文本HyperText,连成可相互参阅的WWW(World Wide Web,万维网),WWW是Web浏览器当年用来浏览超文本的客户端应用程序的名称,现在用来表示这一系列的集合,简称为web,web应用层协议是超文本传输协议,是web的核心。
- 构建技术:1.把SGML(标准通用标记语言)作为页面的文本标记语言的HTML(超文本标记语言) 2.作为文档传递协议的HTTP 3.指定文档所在地址的URL(Uniform Resource Locator 统一资源定位符)
- HTTP/1.0
- HTTP/1.1
dns服务
dns(Domain Name System)提供域名到IP地址之间的解析服务。用户通常使用主机名或域名来访问对方的计算机,而不是直接通过IP地址访问。
浏览器输入Url
URL和URI
- URL统一资源定位符,使用浏览器等访问web服务器输入的地址,如http://qq.com/
- URI(Uniform Resource Identifier)统一资源标识符。 URI格式:
1.协议方案名。某个协议方案(http,ftp等)表示的资源定位标识符。协议方案包括ftp,telnet,file,http等。
URI举例:
2.登录信息。指定用户名和密码作为从服务器获取资源时必要的登录信息,此项是可选项。
3.服务器地址。可以是域名或是IP地址。
4.服务器端口号。可选项,默认是80.
5.文件路径。指定服务器上的文件路径来定位特指的资源。
6.查询字符串。可选项,可通过查询字符串传入任意参数。
7.片段标识符。可选项。
- URI用字符串标识某一互联网资源,而URL标识资源的地点。
http格式
- 请求报文由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成。
- 响应报文由协议版本,状态码,解释状态码的原因短语,可选的响应首部字段以及实体主体构成。
请求方法
- GET方法用来请求访问已被URI标识的资源,方法名区分大小写。
POST方法用来传输实体的主体。虽然用GET方法也可以传输实体的主题,但一般不用GET方法进行传输,而是用POST方法。
PUT方法用来传输文件。自身不带验证机制,任何人都可以上传文件,存在安全性问题,一般Web网站不适用该方法。
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性以及资源更新的日期时间等。
DELETE方法用来删除文件。
OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。
CONNECT方法要求在于代理服务器通信时尽力隧道,实现用隧道协议进行TCP通信,主要使用SSL(Secure Sockets Layer安全套接层)和TLS(Transport Layer Security传输层安全)协议把通信内容加密后经网络隧道传输。
POST传输数据格式
post提交数据必须放在主题中,但协议并未规定数据使用什么编码。接收端根据请求头中的content-type字段来获知请求中的消息主题是何种编码,再对主体进行解析。
Content-Type格式: Content-Type:type/subtype;parameter
type:主类型,如text,*代表所有.
subtype:子类型,如html.
parameter:可选参数,如charset,boundary等.
Content-Type:application/json;charset:utf-8;
常见举例:
1.Content-Type=application/x-www-form-urlencoded 最常见的POST提交数据方式,一般用于表单提交。会将参数用key1=val1&key2=val2的格式放入请求实体,如果是中文或特殊字符需要进行URL转码。URL是用来打包表单输入的格式,将key/value参数编码(移除那些不能传送的字符)。
2.Content-Type=application/json;charset=utf-8;
需要参数本身就是json格式,直接放入请求实体里,接收端会按json格式解析数据。
3.Content-Type=text/xml;
4.Content-Type=application/octet-stream 二进制
url编码
http参数传输是以”key1=value1&key2=value2”键值对传输的,服务器收到字符串时会用&分隔每个参数,用=分隔参数值。如果参数值中包含=或者&特殊字符时就需要Url编码。
url编码只是在特殊字符的各个字节(16进制)前加%即可。如name1=va%26lu%3D,服务器会把%后的字节当成普通字节,不会当成分隔符。
url编码只允许包含英文,数字,4个特殊字符(-_.~)以及所有保留字符(/?#[]@),用于分隔协议,主机,路径等。其余的需要url编码。
url编码默认使用ASCII编码,对于unicode字符,使用utf-8编码得到相应的字节,再在每个字节前加%编码。如”中文”使用utf-8编码得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过URL编码之后得到%E4%B8%AD%E6%96%87
部分字符转义:
+ 表示空格 %2B
# 表示书签
持久连接
- http协议的初始版本中,每进行一次http通信就要断开一次TCP连接。随着HTTP的普及,HTML页面中包含大量的图片,在发送访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源,造成无畏的TCP连接建立和断开,增加通信量的开销。
- HTTP/1.1和一部分HTTP/1.0实现了持久连接(HTTP keep-alive)的方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态。建立1次连接后进行多次请求和响应操作。
HTTP/1.0 1.报文首部添加Connection:Keep-Alive告知服务器保持连接 2.如果服务器愿意为下一条请求保持连接,在响应报文包含相同的首部 3.Keep-Alive选项,如: Connection: Keep-Alive Keep-Alive: max=5, timeout=120 max 服务器还处理5个事务,timeout 2分钟后服务器会关闭连接。
HTTP/1.1 默认就是持久连接,除非特别指明。 1.关闭条件需要在报文中显式添加Connection:close首部。客户端收到响应后,无法在那条连接上发送更多请求了。 2.如果客户端不想在连接上继续发送请求,也需要在报文中添加close首部 3.所有客户端,服务器都可以在任意时刻关闭一条tcp连接。 4.持久连接空闲一段时间后,服务器会关闭连接。
cookie状态管理
http是无状态协议,不对之前发生过的请求和响应状态进行持久化管理。应用场景:要求登录认证的Web页面每次跳转新页面时要么再次登录,要么在请求报文中附加参数来管理登录状态。
Cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。服务端返回的响应报文内的set-cookie首部字段通知客户端保存cookie信息,当下次客户端再请求时,自动在请求报文中加入cookie值。服务端再通过cookie值去检查是哪一个客户端发来的连接请求,对比服务端上的记录,最后得到之前的状态信息。
http请求报文及响应报文结构
用于http协议交互的信息称为http报文,由多行数据构成的字符串文本信息构成,分为报文首部和报文主体,由空行(CR+LF)划分。
请求行
包含请求的方法,请求URI和HTTP版本
状态行
包含表明响应结果的状态码,原因短语和HTTP版本 状态码 客户端向服务器发送请求时,描述返回的请求结果。
- 2xx的响应结果表明请求被正常处理了。
1.200 0K
2.204 No Content 服务器成功处理,但响应报文中不含实体的主体不封。
3.206 Partial Content 客户端进行了范围请求,服务器成功执行了这部分的GET请求。 - 3xx响应结果表明浏览器需要执行某些特殊的处理。
1.301 Moved Permanently 永久性重定向,表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
2.302 Found 临时性重定向,表示请求的资源已被分配了新的URI,希望用户能使用新的URI访问。
3.303 See Other 请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。 - 4xx 响应结果表明客户端是发生错误的原因所在。
1.400 Bad Request 表示请求报文中存在语法错误。
2.401 Unauthorized 表示发送的请求需要有通过HTTP认证的认证信息。
3.403 Forbidden 表明对请求资源的访问被服务器拒绝了。
4.404 Not Found 表明服务器上无法找到请求的资源。 5xx 响应结果表明服务器本身发生错误
1.500 Internal Server Error 服务器端再执行请求时发生了错误,可能是Web应用存在的bug或某些临时故障
2.503 Service Unavailable 服务器暂时处理超负载或正在进行停机维护,现在无法处理请求。HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部,首部内容为客户端和服务器分别处理请求和响应提供所需要的信息,包含表示请求和响应的各种条件和属性的各类首部字段。
HTTP请求报文
由请求方法,请求URI,HTTP版本,HTTP首部字段等部分组成。
HTTP响应报文
由HTTP版本,状态码,原因短语,HTTP首部字段等部分组成。
HTTP首部字段
由字段名和字段值构成,中间用冒号分隔,如: Content-Type: text/html Keep-Alive: timeout=15,max=100 字段值可以有多个值 以下都是HTTP/1.1首部字段一览
通用首部字段 请求报文和响应报文都会使用的首部
请求首部字段 发送请求报文使用的首部字段,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息。
响应首部字段 服务器向客户端返回响应报文时使用的首部字段,补充了响应的附加内容。
实体首部字段 针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等于实体有关的信息。
非HTTP/1.1首部字段 Cookie,Set-Cookie,Centent-Disposition等
socks5代理与http代理的区别
socks5协议是同时支持TCP和UDP的应用层协议,并不负责代理服务器的数据传输环节,只是在C/S两端之间建立起一条从客户端到代理服务器的授信连接。 参考:https://loggerhead.me/posts/shadowsocks-yuan-ma-fen-xi-xie-yi-yu-jie-gou.html
http代理,会解释和重写报头,执行更高层次的过滤。通常只用于GET和POST方法,不用于CONNECT。 参考:https://zhuanlan.zhihu.com/p/28737960
其他应用层协议
- telnet 远程登录
- ssh 加密的远程登录系统
- FTP 两个连接的计算机之间进行文件传输时使用的协议,使用2条TCP连接,1条用来控制,另1条用于数据传输。
SMTP(simple mail transfer protocol)电子邮件服务协议
MIME
MIME媒体类型(如application/x-www-form-urlencoded),描述了报文实体主体消息内容的格式,属于OSI第六层表示层,email和http都使用MIME。早期的email只能处理文本格式的邮件。现在的email可以发送的数据类型已被扩展到MIME(multipurpose internet mail extensions),可以发送静态图像,动画,声音,程序等各种形式的数据。
- 原文作者:niep
- 原文链接:http://www.fdgggy.com/2019/11/17/yingyongceng/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。