网络通讯与HTTP协议
OSI与TCP/IP各层的结构与功能,都有哪些协议?
学习计算机网络时我们一般采用折中的办法,也就是中和OSI
和TCP/IP
的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。
结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。
应用层
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS
,支持万维网应用的HTTP
协议,支持电子邮件的SMTP
协议等等。我们把应用层交互的数据单元称为报文。
域名系统
域名系统(Domain Name System缩写
DNS
,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP
地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP
数串。(百度百科)例如:一个公司的Web
网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM
公司的域名是www.ibm.com、Oracle公司的域名是www.oracle.com、Cisco公司的域名是www.cisco.com等。
HTTP 协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的
WWW
(万维网)文件都必须遵守这个标准。设计HTTP
最初的目的是为了提供一种发布和接收HTML
页面的方法。(百度百科)
运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
- 传输控制协议
TCP
(Transmission Control Protocol)--提供面向连接的,可靠的数据传输服务。 - 用户数据协议
UDP
(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
TCP与UDP的对比见问题三。
网络层
在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP
体系结构中,由于网络层使用IP
协议,因此分组也叫IP
数据报,简称数据报。
这里要注意:不要把运输层的“用户数据报UDP
”和网络层的“IP
数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。
这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构(heterogeneous
)网络通过路由器(router
)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Internet Protocol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP
数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
物理层
在物理层上所传送的数据单位是比特。
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
在互联网使用的各种协议中最重要和最著名的就是TCP/IP
两个协议。现在人们经常提到的TCP/IP
并不一定单指TCP
和IP
这两个具体的协议,而往往表示互联网所使用的整个TCP/IP
协议族。
小结
上面我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下(图片来源于网络)。
TCP三次握手和四次挥手(面试常客)
为了准确无误地把数据送达目标处,TCP
协议采用了三次握手策略。
TCP三次握手漫画图解
如下图所示,下面的两个机器人通过3次握手确定了对方能正确接收和发送消息(图片来源:《图解HTTP》)。
简单示意图:
- 客户端–发送带有
SYN
标志的数据包–一次握手–服务端 - 服务端–发送带有
SYN/ACK
标志的数据包–二次握手–客户端 - 客户端–发送带有带有
ACK
标志的数据包–三次握手–服务端
详细示意图(图片来源不详)
为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client
什么都不能确认;Server
确认了对方发送正常,自己接收正常
第二次握手:Client
确认了:自己发送、接收正常,对方发送、接收正常;Server
确认了:对方发送正常,自己接收正常
第三次握手:Client
确认了:自己发送、接收正常,对方发送、接收正常;Server
确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
第2
次握手传回了ACK
,为什么还要传回SYN
?
接收端传回发送端所发送的ACK
是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN
则是为了建立并确认从服务端到客户端的通信。”
SYN
同步序列编号(Synchronize Sequence Numbers)是TCP/IP
建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP
网络连接时,客户机首先发出一个SYN
消息,服务器使用SYN-ACK应答表示接收到了这个消息,最后客户机再以ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的TCP
连接,数据才可以在客户机和服务器之间传递。
为什么要四次挥手
断开一个TCP
连接则需要“四次挥手”:
- 客户端-发送一个
FIN
,用来关闭客户端到服务器的数据传送 - 服务器-收到这个
FIN
,它发回一个ACK
,确认序号为收到的序号加1
。和SYN
一样,一个FIN
将占用一个序号 - 服务器-关闭与客户端的连接,发送一个
FIN
给客户端 - 客户端-发回
ACK
报文确认,并将确认序号设置为收到序号加1
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP
连接。
举个例子:A
和B
打电话,通话即将结束后,A
说“我没啥要说的了”,B
回答“我知道了”,但是B
可能还会有要说的话,A
不能要求B
跟着自己的节奏结束通话,于是B
可能又巴拉巴拉说了一通,最后B
说“我说完了”,A
回答“知道了”,这样通话才算结束。
上面讲的比较概括,推荐一篇讲的比较细致的文章:https://blog.csdn.net/qzcsu/article/details/72861891
TCP,UDP协议的区别
UDP
在传送数据之前不需要先建立连接,远地主机在收到UDP
报文后,不需要给出任何确认。虽然UDP
不提供可靠交付,但在某些情况下UDP
却是一种最有效的工作方式(一般用于即时通信),比如:QQ
语音、QQ
视频、直播等等
TCP
提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP
不提供广播或多播服务。由于TCP
要提供可靠的,面向连接的传输服务(TCP
的可靠体现在TCP
在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP
一般用于文件传输、发送和接收邮件、远程登录等场景。
TCP协议如何保证可靠传输
- 应用数据被分割成
TCP
认为最适合发送的数据块。 TCP
给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。- 校验和:
TCP
将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP
将丢弃这个报文段和不确认收到此报文段。 TCP
的接收端会丢弃重复的数据。- 流量控制:
TCP
连接的每一方都有固定大小的缓冲空间,TCP
的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP
使用的流量控制协议是可变大小的滑动窗口协议。(TCP
利用滑动窗口实现流量控制) - 拥塞控制:当网络拥塞时,减少数据的发送。
- ARQ协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传:当
TCP
发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
ARQ协议
自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI
模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ
包括停止等待ARQ
协议和连续ARQ
协议。
停止等待ARQ协议
停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复ACK
)。如果过了一段时间(超时时间后),还是没有收到ACK
确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组。
在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
优缺点:
- 优点:简单
- 缺点:信道利用率低,等待时间长
1) 无差错情况:
发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。
2) 出现差错情况(超时重传):
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ
。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续ARQ
协议可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。
3) 确认丢失和确认迟到
- 确认丢失:确认消息在传输过程丢失。当
A
发送M1
消息,B
收到后,B
向A
发送了一个M1
确认消息,但却在传输过程中丢失。而A
并不知道,在超时计时过后,A
重传M1
消息,B
再次收到该消息后采取以下两点措施:1.丢弃这个重复的M1
消息,不向上层交付。2.向A
发送确认消息。(不会认为已经发送过了,就不再发送。A
能重传,就证明B
的确认消息丢失)。 - 确认迟到:确认消息在传输过程中迟到。
A
发送M1
消息,B
收到并发送确认。在超时时间内没有收到确认消息,A
重传M1
消息,B
仍然收到并继续发送确认消息(B
收到了2
份M1
)。此时A
收到了B
第二次发送的确认消息。接着发送其他数据。过了一会,A
收到了B
第一次发送的对M1
的确认消息(A
也收到了2
份确认消息)。处理如下:1.A
收到重复的确认后,直接丢弃。2.B
收到重复的M1
后,也直接丢弃重复的M1
。
连续ARQ协议
连续ARQ
协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优缺点:
- 优点:信道利用率高,容易实现,即使确认丢失,也不必重传。
- 缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。比如:发送方发送了
5
条消息,中间第三条丢失(3
号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫Go-Back-N(回退N
),表示需要退回来重传已经发送过的N
个消息。
滑动窗口和流量控制
TCP
利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为0
,则发送方不能发送数据。
拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP
发送方要维持一个拥塞窗口(cwnd)的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP
的拥塞控制采用了四种算法,即慢开始、拥塞避免、快重传和快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理AQM
),以减少网络拥塞的发生。
- 慢开始:慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。
cwnd
初始值为1
,每经过一个传播轮次,cwnd
加倍。 - 拥塞避免:拥塞避免算法的思路是让拥塞窗口
cwnd
缓慢增大,即每经过一个往返时间RTT
就把发送放的cwnd
加1
. - 快重传与快恢复:在
TCP/IP
中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有FRR
,如果数据包丢失了,TCP
将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了FRR
,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了FRR
,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和恢复(FRR
)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
在浏览器中输入url
地址 ->> 显示主页的过程(面试常客)
百度好像最喜欢问这个问题。
打开一个网页,整个过程会使用哪些协议?
图解(图片来源:《图解HTTP》):
上图有一个错误,请注意,是
OSPF
不是OPSF
。OSPF
(Open Shortest Path First,ospf)开放最短路径优先协议,是由Internet
工程任务组开发的路由选择协议
总体来说分为以下几个过程:
DNS
解析TCP
连接- 发送
HTTP
请求 - 服务器处理请求并返回
HTTP
报文 - 浏览器解析渲染页面
- 连接结束
具体可以参考下面这篇文章:
各种协议与HTTP协议之间的关系
一般面试官会通过这样的问题来考察你对计算机网络知识体系的理解。
图片来源:《图解HTTP》
HTTP协议简介
超文本传输协议(英文:HyperTextTransferProtocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP
是万维网的数据通信的基础。
HTTP
的发展是由蒂姆·伯纳斯-李于1989
年在欧洲核子研究组织(CERN
)所发起。HTTP
的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC
,其中最著名的是1999
年6
月公布的RFC 2616,定义了HTTP
协议中现今广泛使用的一个版本——HTTP 1.1。
2014
年12
月,互联网工程任务组(IETF
)的Hypertext Transfer Protocol Bis(httpbis
)工作小组将HTTP/2
标准提议递交至IESG
进行讨论,于2015
年2
月17
日被批准。HTTP/2
标准于2015
年5
月以RFC 7540正式发表,取代HTTP 1.1成为HTTP
的实现标准。
HTTP协议概述
HTTP
是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP
)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP
请求到服务器上指定端口(默认端口为80
)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML
文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel
)。
尽管TCP/IP
协议是互联网上最流行的应用,HTTP
协议中,并没有规定必须使用它或它支持的层。事实上,HTTP
可以在任何互联网协议上,或其他网络上实现。HTTP
假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP
协议族使用TCP
作为其传输层。
通常,由HTTP
客户端发起一个请求,创建一个到服务器指定端口(默认是80
端口)的TCP
连接。HTTP
服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
HTTP工作原理
HTTP
协议定义Web
客户端如何从Web
服务器请求Web
页面,以及服务器如何把Web
页面传送给客户端。HTTP
协议采用了请求/
响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL
、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是HTTP
请求/
响应的步骤:
\1. 客户端连接到Web
服务器
一个HTTP
客户端,通常是浏览器,与Web
服务器的HTTP
端口(默认为80
)建立一个TCP
套接字连接。例如,http://www.baidu.com。
\2. 发送HTTP
请求
通过TCP
套接字,客户端向Web
服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4
部分组成。
\3. 服务器接受请求并返回HTTP
响应
Web
服务器解析请求,定位请求资源。服务器将资源复本写到TCP
套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4
部分组成。
\4. 释放连接TCP
连接
若connection
模式为close
,则服务器主动关闭TCP
连接,客户端被动关闭连接,释放TCP
连接;若connection
模式为keepalive
,则该连接会保持一段时间,在该时间内可以继续接收请求;
\5. 客户端浏览器解析HTML
内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML
文档和文档的字符集。客户端浏览器读取响应数据HTML
,根据HTML
的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL
,按下回车之后会经历以下流程:
- 浏览器向
DNS
服务器请求解析该URL
中的域名所对应的IP
地址; - 解析出
IP
地址后,根据该IP
地址和默认端口80
,和服务器建立TCP
连接; - 浏览器发出读取文件
(URL
中域名后面部分对应的文件)的HTTP
请求,该请求报文作为TCP
三次握手的第三个报文的数据发送给服务器; - 服务器对浏览器请求作出响应,并把对应的
html
文本发送给浏览器; - 释放
TCP
连接; - 浏览器将该
html
文本并显示内容;
http协议是基于TCP/IP协议之上的应用层协议。
基于 请求-响应 的模式
HTTP
协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应
无状态保存
HTTP
是一种不保存状态,即无状态(stateless
)协议。HTTP
协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP
这个级别,协议对于发送过的请求或响应都不做持久化处理。
使用HTTP
协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP
协议设计成如此简单的。可是,随着Web
的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie
技术。有了Cookie
再用HTTP
协议通信,就可以管理状态了。有关Cookie
的详细内容稍后讲解。
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http
协议是一个请求一个响应之后,直接就断开了,但是现在的http
协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3
秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。
HTTP请求方法
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
GET
向指定的资源发出“显示”请求。使用GET
方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application
中。其中一个原因是GET
可能会被网络蜘蛛等随意访问。
HEAD
与GET
方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT
向指定资源位置上传其最新内容。
DELETE
请求服务器删除Request-URI
所标识的资源。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP
请求方法。用'*'来代替资源名称,向Web
服务器发送OPTIONS
请求,可以测试服务器功能是否正常运作。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL
加密服务器的链接(经由非加密的HTTP
代理服务器)。
注意事项:
- 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码
405
(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501
(Not Implemented)。 HTTP
服务器至少应该实现GET
和HEAD
方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP
服务器还能够扩展自定义的方法。例如PATCH
(由RFC 5789 指定的方法)用于将局部修改应用到资源。
请求方式:get与post请求(通过form表单我们自己写写看)
GET
提交的数据会放在URL
之后,也就是请求行里面,以?分割URL
和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456.(请求头里面那个content-type做的这种参数形式,后面讲)POST方法是把提交的数据放在HTTP包的请求体中.- GET提交的数据大小有限制(因为浏览器对
URL
的长度有限制),而POST
方法提交的数据没有限制. GET
与POST
请求在服务端获取请求数据方式不同,就是我们自己在服务端取请求数据的时候的方式不同了,这句废话昂。
HTTP状态码
所有HTTP
响应的第一行都是状态行,依次是当前HTTP
版本号,3
位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
1xx
消息——请求已被服务器接收,继续处理2xx
成功——请求已成功被服务器接收、理解、并接受3xx
重定向——需要后续操作才能完成这一请求4xx
请求错误——请求含有词法错误或者无法被执行5xx
服务器错误——服务器在处理某个正确请求时发生错误
虽然RFC 2616中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB
开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
URL
超文本传输协议(HTTP
)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
- 传送协议。
- 层级
URL
标记符号(为[//],固定不变) - 访问资源需要的凭证信息(可省略)
- 服务器。(通常为域名,有时为IP地址)
- 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
- 路径。(以“/”字符区别路径中的每一个目录名称)
- 查询。(
GET
模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8
的URL
编码,避开字符冲突的问题) - 片段。以“#”字符为起点
以http://www.luffycity.com:80/news/index.html?id=250&page=1为例,其中:
http
,是协议;
www.luffycity.com,是服务器;
80
,是服务器上的默认网络端口号,默认不显示;
/news/index.html,是路径(URI:直接定位到对应的资源);
?id=250&page=1,是查询。
大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。
由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如www
。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。
HTTP请求格式(请求协议)
URL
包含:/index/index2?a=1&b=2;路径和参数都在这里。
请求头里面的内容举个例子:这个length
表示请求体里面的数据长度,其他的请求头里面的这些键值对,陆续我们会讲的,大概知道一下就可以了,其中有一个user-agent,算是需要你记住的吧,就是告诉你的服务端,我是用什么给你发送的请求。
以京东为例,看一下user-agent
看一个爬虫的例子,爬京东的时候没问题,但是爬抽屉的时候必须带着user-agent,因为抽屉对user-agent做了判断,来判断你是不是一个正常的请求,算是反扒机制的一种。
打开我们保存的demo.html文件,然后通过浏览器打开看看就能看到页面效果。
写上面这些内容的意思是让你知道有这么个请求头的存在,有些是有意义的,请求头我们还可以自己定义,就在requests模块里面那个headers={},这个字典里面加就行。
HTTP响应格式(响应协议)
HTTP长连接,短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP
操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML
或其他类型的Web
页中包含有其他的Web
资源(如JavaScript
文件、图像文件、CSS
文件等),每遇到这样一个Web
资源,浏览器就会重新建立一个HTTP
会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP
协议,会在响应头加入这行代码:
Connection:keep-aliveCopy to clipboardErrorCopied
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP
数据的TCP
连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache
)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP
协议的长连接和短连接,实质上是TCP
协议的长连接和短连接。
HTTP是不保存状态的协议,如何保存用户状态?
HTTP
是一种不保存状态,即无状态(stateless
)协议。也就是说HTTP
协议自身不对请求和响应之间的通信状态进行保存。那么我们保存用户状态呢?Session
机制的存在就是为了解决这个问题,Session
的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为HTTP
协议是无状态的。服务端给特定的用户创建特定的Session
之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个Session
,过了时间限制,就会销毁这个Session
)。
在服务端保存Session
的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis
保存)。既然Session
存放在服务器端,那么我们如何实现Session
跟踪呢?大部分情况下,我们都是通过在Cookie
中附加一个Session ID
来方式来跟踪。
Cookie被禁用怎么办?
最常用的就是利用URL
重写把Session ID
直接附加在URL
路径的后面。
Cookie的作用是什么?和Session区别
Cookie
和Session
都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
Cookie
一般用来保存用户信息比如①我们在Cookie
中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个Token
在Cookie
中,下次登录的时候只需要根据Token
值来查找用户即可(为了安全考虑,重新登录一般要将Token
重写);③登录一次网站后访问网站其他页面不需要重新登录。Session
的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为HTTP
协议是无状态的。服务端给特定的用户创建特定的Session
之后就可以标识这个用户并且跟踪这个用户了。
Cookie
数据保存在客户端(浏览器端),Session
数据保存在服务器端。
Cookie
存储在客户端中,而Session
存储在服务器上,相对来说Session
安全性更高。如果要在Cookie
中存储一些敏感信息,不要直接写入Cookie
中,最好能将Cookie
信息加密然后使用到的时候再去服务器端解密。
HTTP 1.0和HTTP 1.1的主要区别
这部分回答引用这篇文章https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A?的一些内容。
HTTP 1.0
最早在网页中使用是在1996
年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP 1.1
则在1999
年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP 1.1
也是当前使用最为广泛的HTTP
协议。主要区别主要体现在:
- 长连接: 在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。
HTTP
是基于TCP/IP
协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP1.1
起,默认使用长连接,默认开启Connection:keep-alive。HTTP/1.1
的持续连接有非流水线方式和流水线方式。流水线方式是客户在收到HTTP
的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。 - 错误状态响应码 :在
HTTP1.1
中新增了24
个错误状态响应码,如409
(Conflict
)表示请求的资源与资源的当前状态发生冲突;410
(Gone
)表示服务器上的某个资源被永久性的删除。 - 缓存处理:在HTTP1.0中主要使用
header
里的If-Modified-Since
,Expires
来做为缓存判断的标准,HTTP 1.1
则引入了更多的缓存控制策略例如Entity tag
,If-Unmodified-Since
,If-Match
,If-None-Match
等更多可供选择的缓存头来控制缓存策略。 - 带宽优化及网络连接的使用:
HTTP1.0
中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1
则在请求头引入了range
头域,它允许只请求资源的某个部分,即返回码是206
(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
URI和URL的区别
- URI(Uniform Resource Identifier)是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator)是统一资源定位符,可以提供该资源的路径。它是一种具体的
URI
,即URL
可以用来标识一个资源,而且还指明了如何locate
这个资源。
URI
的作用像身份证号一样,URL
的作用更像家庭住址一样。URL
是一种具体的URI
,它不仅唯一标识资源,而且还提供了定位该资源的信息。
HTTP和HTTPS的区别
- 端口:
HTTP
的URL
由“http://”起始且默认使用端口80
,而HTTPS
的URL
由“https://”起始且默认使用端口443
。 - 安全性和资源消耗:
HTTP
协议运行在TCP
之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS
是运行在SSL/TLS
之上的HTTP
协议,SSL/TLS
运行在TCP
之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP
安全性没有HTTPS
高,但是HTTPS
比HTTP
耗费更多服务器资源。- 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有
DES
、AES
等; - 非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有
RSA
、DSA
等。
- 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有