HTML网络协议
本文主要简单的论述下计算机网络的大概结构,并重点讲解下自己对HTTP协议的理解。所有的因特网标准都是以RFC(Request For Comments)的形式在因特网上发表的,任何人都可以用电子邮件随时发表对某个文档的意见或建议。
计算机网络体系
OSI的七层协议概念清楚,理论完整,但它复杂又不实用,在实际中我们广泛应用的是TCP/IP四层体系结构,但我们在学习计算机网络原理时,常采用五层协议的体系结构。五层协议是指应用层、运输层、网络层、数据链路层、物理层。
- 应用层直接为用户的应用进程(正在运行的程序)提供服务,该层协议有:HTTP、SMTP(电子邮件)、FTP等。
- 运输层主要负责为两个主机进程之间的通信提供服务,主要使用TCP(传输控制协议)、UDP(用户数据报协议)这两种协议。TCP是面向连接的、可靠的、有序的、速度慢的协议,常应用于传输大量数据的场合;UDP是无连接的、不可靠的、无序的、速度快的协议,提供尽最大努力交付,常应用于传输少量数据的场合。基于TCP的协议有:HTTP(80)/HTTPS(443),Telnet(23),FTP(21),SMTP(25)。基于UDP的协议有:DHCP(67),DNS(53)。
- 网络层负责为分组交换网上的不同主机提供通信服务,并且要选择合适的路由,使源主机运输层所传下来的分组能够通过网络中的路由器找到目的主机。在TCP/IP体系中,网络层使用IP协议。该层的协议有地址解析协议ARP、逆地址解析协议RARP、网际控制报文协议ICMP、虚拟专用网VPN、网络地址转换NAT等。
- 数据链路层负责在相邻两个节点之间传送数据时,将网络层交下来的IP数据报组装成帧(每一帧包括数据和必要的控制信息),在节点间的链路上透明地传送帧中的数据。
- 物理层上传送数据的单位是比特,它的任务就是透明的传送比特流。
HTTP协议
在这里简单的说一下客户端访问服务器的工作过程。客户端和服务器之间使用HTTP协议建立TCP连接(三次握手),然后客户端发送HTTP请求报文,服务器返回HTTP响应报文,完成访问后,释放TCP连接(四次挥手)。
HTTP的请求报文和响应报文的区别在于请求报文的开始行叫请求行,响应报文的开始行叫状态行。请求行包括方法、请求资源的URL以及HTTP版本。状态行包括HTTP版本、状态码以及解释状态码的简单短语。在这里解释下__状态码__的含义:
1xx:通知信息。
2xx:成功。
3xx:重定向。
301:所请求的页面已经转移至新的url
302:所请求的页面已经临时转移至新的url
4xx:客户机错误。
401:未授权
403:所请求的页面被禁止访问
404:服务器无法找到被请求的页面
5xx:服务器错误。
500:请求未完成,服务器遇到不可知的问题
502:请求未完成,服务器从上游服务器收到一个无效的响应
504:网关超时
Cookie & Session
HTTP是无状态协议,它没有一个内建机制来维护两个事务之间的状态,但是网站在区别不同用户访问的时候需要进行会话跟踪,所以产生了Cookie和Session。Cookie是通过HTTP请求的头部信息传回服务器的,Session变量的值保存在服务器端(文件/数据库/缓存中)。
当用户访问某个使用Cookie的网站时,该网站的服务器就为此用户产生一个唯一的识别码,并以此作为索引在服务器的后端数据库中产生一个项目,接着在给该用户的HTTP响应报文中添加一个叫Set-cookie的首部行(首部字段名是”Set-cookie”,字段值是”识别码”)。当用户收到响应时,他所使用的浏览器就在它管理的特定Cookie文件中添加一行,包括这个服务器的主机名和识别码,当用户继续访问该网站时,每发送一个HTTP请求报文,其浏览器就会从Cookie文件中取出这个网站的识别码,并放到HTTP请求报文中的Cookie首部行中,这样网站就能跟踪到该用户在该网站的活动。
Cookie将数据存储在客户端,但Cookie相对不太安全,单个Cookie的值最大只能存储4k,每次请求都要进行网络传输,占用带宽。Session将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,PHP默认情况下session id是通过Cookie来保存的,因此从某种程度上来说,Session依赖于Cookie,但这不是绝对的,只要能将session id传递到服务端进行识别的机制都可以实现session。如果客户端禁用Cookie,可以使用URL重写,也可以指定通过GET方式或者POST方式把session id传到服务器。
三次握手 & 四次挥手
TCP链接的建立采用客户服务器方式,主动发起连接建立的应用进程叫客户,被动等待连接建立的应用进程叫服务器。
三次握手
- 第一次握手:客户端将标志位SYN置为1,选择一个初始序号seq=x(随机产生),并将该数据包发送给服务器,客户端进入SYN-SENT状态,等待服务器确认。
- 第二次握手:服务器收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,确认号ack=x+1(ack为前一个的seq+1),也选择一个初始序号seq=y,并将该数据包发送给客户端以确认连接请求,服务器进入SYN-RCVD状态。
- 第三次握手:客户端收到确认后,确认ACK为1,ack是x+1,如果正确则将标志位ACK置为1,ack=y+1,自己的序号seq=x+1(如果ACK报文段不携带数据则不消耗序号)并将该数据包发送给服务器,服务器检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。
四次挥手
第一次挥手:客户端把连接释放报文段首部的FIN置1,序号seq=u(等于前面已传送过的数据的最后一个字节的序号加1),用来关闭客户端到服务器的数据传送,客户端进入FIN-WAIT-1状态。
第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认号为ack=u+1,seq=v,服务器进入CLOSE-WAIT状态(A到B关闭,B到A仍未关闭)。A收到B的确认后,进入Fin-WAIT-2状态。
第三次挥手:服务器发送一个FIN,序号seq=w,ack=u+1,用来关闭服务器到客户端的数据传送,服务器进入LAST-ACK状态。
第四次挥手:客户端收到FIN后,在确认报文段中使ACK=1,ack=w+1,seq=u+1,然后进入TIME-WAIT状态(2MSL,MSL为最长报文段寿命),服务器进入CLOSED状态,完成四次挥手。
TIME-WAIT状态必须等待2MSL的原因:
- 为了保证A发送的最后一个ACK报文段能够到达B,若丢失,B超时重传FIN+ACK报文段。
- 防止已失效的报文段出现在本连接中,A发送完最后一个ACK报文段后,再经过2MSL,可以使本连接持续的时间内所长生的所有报文段都从网络中消失。
HTTP方法
HTTP请求方法总共有八种。HTTP1.0定义了三种请求方法:GET,POST和HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
GET
GET用于从指定的资源请求数据,是http的默认请求方式,一般用来获取数据,传输的数据经过url编码后放在路径?
之后,多个键值对通过&连接,另外get的传输长度一般不推荐超过255个字节。它一般被视为安全方法,因为它仅用来获取数据而不会对服务器有其他改动。
安全方法
像HEAD、GET、OPTIONS和TRACE这几种http方法是被认为是“安全的”,这意味着它们只会进行数据获取而不会修改服务器的状态,不会产生负面影响,比如记录日志、创建缓存或者创建其他统计信息。
像POST、PUT、DELETE和PATCH等方法有可能产生副作用。网络爬虫等一般不会使用这些方式(注:搜索引擎的暗网抓取可能会使用这些方法)。
尽管GET方法是一般被视为“安全的”,但如果在实际使用中没有做任何设置,比如可以无限制的抓取等情况,也会导致一些不可预料的问题,比如web缓存或者搜索引擎问题。
POST
POST用于向指定的资源提交要被处理的数据。数据被包含在请求体中,可能会导致新的资源的建立或已有资源的修改。
为什么一些请求会使用POST提交数据?
- GET请求数据都可以在URL中看到,不应在处理敏感数据时使用,而POST请求数据在URL中是不可见的。
- GET提交的数据都会有长度限制(URL的最大长度是2048个字符),POST没有长度限制。
- 一般规范,GET用来获取数据,POST用来修改数据。
- GET请求可以被缓存,会被保留在浏览器的历史记录中,而POST请求不能被缓存,也不会被保留在浏览器的历史记录中。
- GET请求提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中。
其他请求方法
HEAD | 与 GET 相同,但只返回HTTP报头,不返回文档主体。 |
PUT | 从客户端向服务器传送数据取代指定的文档内容,如果存在则修改内容,否则创建新内容。 |
DELETE | 请求服务器删除指定的页面。 |
TRACE | 返回接受到的请求,用来查看数据经过中间服务器时发生了哪些变动。 |
OPTIONS | 返回服务器支持的所有HTTP方法。 |
CONNECT | 要求使用SSL和TLS进行TCP通信。 |