ICMP(Internet Control Message Protocol)Internet控制报文协议,是一种面向无连接的网络层协议,是TCP/IP协议族的一个子协议,用于主机、路由器之间传递控制消息。ICMP协议的主要功能是确认IP包是否成功到达目标地址,通知在发送过程中IP包被丢弃的原因。
IGMP(Internet Group Management Protocol)Internet组管理协议,是TCP/IP协议族中负责IPV4组播成员管理的协议。IGMP协议用来接收主机与其直接相邻的组播路由器之间建立和维护组播成员关系,通过在接受主机和组播路由器之间交互IGMP报文实现组成员管理功能,IGMP报文封装在IP报文中,IGMP共有v1、v2、v3三个版本。
ARP(Address Resolution Protocal)地址解析协议,其基本功能为透过目标设备的IP地址,查询目标的MAC地址,以保证通信顺利进行。它是IPv4网络层必不可少的协议,不过在IPv6已经不再适用,并被邻居发现协议(NDP)所替代。
RARP(Reverse Address Resolution Protocol)反向地址转换协议允许局域网的物理机器从网关服务器的ARP表或缓存上请求IP地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的IP地址,当设置一台新的机器时,其RARP客户机程序需要想路由器上的RARP服务器请求响应的IP地址。
应用场景:
状态码 | 状态 | 描述 |
---|---|---|
200 | Ok | 请求成功 |
204 | No Content | 请求被受理但没有资源可以返回 |
206 | Partial Content | 客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法 |
301 | Moved Permanently | 永久性重定向 |
302 | Found | 临时重定向 |
303 | See Other | 与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上 |
304 | Not Modified | 发送附带条件的请求时,条件不满足时返回,与重定向无关 |
307 | Temporary Redirect | 临时重定向,与302类似,只是强制要求使用POST方法 |
400 | Bad Request | 请求语法错误,不能被服务器解析 |
401 | Unauthorized | 未经授权,需与www-Authenticate一起用 |
403 | Forbidden | 服务器收到请求,但拒绝提供服务 |
404 | Not Found | 请求资源不存在 |
500 | Internal Server Error | 服务器发生不可预期的错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
总之,HTTP状态码分为5个类别:
参考来源
SYN=1, seq=x
。SYN=1, ACK=1, seq=y, ack=x+1
。ACK=1, seq=x+1, ack=y+1
。FIN=1, seq=u
。ACK=1, seq=v, ack=u+1
。FIN=1, ACK=1, seq=w, ack=u+1
。ACK=1, seq=u+1, ack=w+1
。因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,客户端会把Cookie保存起来。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录,以便再次访问时确认身份。每个用户访问服务器都会建立一个session,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。
session和cookie的区别:
应用场景:
即加密密钥和解密密钥相同,如DES、AES等。
将加密密钥分为公钥和私钥,公钥可以公开,私钥是保密的;客户端用公钥加密数据,服务端可以用私钥解密。如RSA、ECC等。
HTTP协议传输的数据都是为加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能够加密传输,引入了SSL(Secure Sockets Layer)协议对HTTP协议传输的数据进行加密,因此HTTPS等同于HTTP + SSL。
HTTPS协议简单来说就是HTTP + SSL协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议更加安全。
HTTP与HTTPS的主要区别:
无状态协议对于事务处理没有记忆能力,无状态记录导致同一客户端HTTP请求完成后,再次发送HTTP请求时,HTTP不知道当前客户端是一个“老客户”。
解决:使用Cookie,Cookie相当于一个身份通行证,客户端第一次访问时给客户端发一个Cookie,当该客户端再次访问时,验证Cookie服务器就可放行。
参考来源
请求报文包含四个部分:
响应报文包含四个部分:
通用首部字段
请求首部字段
响应首部字段
实体首部字段
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:
Connection: keep-alive
,TCP连接在发送后将仍然保持打开状态,这时浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间经过以下7个步骤:
Connection: keep-alive
参考来源
缓存处理:在HTTP1.0中主要使用header里的
If-Modified-Since
,Expires
来做缓存判断的标准,HTTP1.1则引入了更多缓存控制策略,如Entity tag
,If-Unmodified-Since
,If-Match
,If-None-Match
等更多可供闲着的缓存头来控制缓存策略。
带宽优化及网络连接的使用:在HTTP1.0中,存在一些浪费带宽的现象,如客户端是需要某个对象的一部分,而服务器却将整个对象发送过来了,并且不支持断点续传功能;在HTTP1.1中,在请求头引入了Range头域,它允许只请求资源的某个个部分,即返回码是206(Partial Content),这使得开发者可以自由选择,以便充分利用带宽和连接。
错误通知管理:在HTTP1.1中新增了24个错误状态响应码,如409表示请求资源与资源当前的状态发生冲突;410便是服务器上的某个资源被永久删除。
Host头处理:在HTTP1.0中认为每台服务器都绑定唯一的IP地址,因此请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且他们共享一个IP地址;在HTTP1.1中,请求消息和响应消息都支持Host头域,且请求消息中如果没有Host头域会报告400(Bad Request)。
长连接:HTTP1.1支持长连接(Persistent Connection)和请求的流水线处理(Pipelining),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启
Connection: keep-alive
,一定程度受伤弥补了HTTP1.0每次请求都要创建连接的缺点。
新增Request方法:HTTP1.1增加了OPTIONS、PUT、DELETE、TRACE、CONNECT这些Request方法。
参考来源
二进制格式(Binary Format):HTTP1.x的解析是基于文本协议格式解析的,存在缺陷不够健壮;而HTTP2.0的协议解析采用的是二进制格式,通用更健壮。
多路复用(MultiPlexing):即连接共享,每个request都是使用连接共享机制,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机混杂在一起,接收方可以根据request的id将request归属到各自不同的服务端请求里。
header压缩:在HTTP1.x的header中带有大量的信息,而且每次请求都要重复发送,而HTTP2.0中使用encoder来减少需要传输的header的大小,通讯双方各自cache一份header fields表,既避免了重复传输header,又减少了需要传输的大小。
服务端推送(Server Push):同SPDY一样,HTTP2.0也具有Server Push的功能,如网页有个style.css的请求,在客户端接收到style.css数据的同时,服务端会将style.js的文件推送给客户端,但客户端再次尝试获取style.js时就可以直接从缓存中获取,就不用在发请求了。
图解HTTPS
TCP拥塞控制
发送方维持一个拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地变化;发送方让自己的发送窗口等于拥塞窗口,控制拥塞窗口的原则是只要网络没有出现拥塞,拥塞窗口就在增大一些,以便把更多的分组发送出去;但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络的分组数。
慢开始算法:慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段,目的是试探网络的拥塞情况,然后在cwnd加倍增大。为了防止拥塞窗口cwnd增长过大引起网络拥塞,设置一个慢开始门限
ssthresh
状态变量,当cwnd < ssthresh
时,使用慢开始算法;当cwnd > ssthresh
时,停止使用慢开始算法而改用拥塞避免算法;当cwnd = ssthresh
时,既可使用慢开始算法也可以使用拥塞避免算法。
拥塞避免算法:每经过一个往返时间RTT就把发送方的拥塞窗口
cwnd+1
,按线性规律缓慢增长,而不是加倍增长,所以比慢开始算法的拥塞窗口增长速率缓慢得多。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就要把慢开始门限ssthresh
设置为出现拥塞时发送方窗口子的一半(且>=2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法,如此迭代重复,直到迅速减少主机发送到网络中的分组数,使得积压的分组处理完毕。
快重传算法:首先要求接收方每收到一个失序的报文段后就立即发出重复确认,而不会等到自己发送数据时才进行捎带确认。发送方一连收到三个重复确认就应当立即重传对方未接收到的报文段,而不用继续等待为发送成功报文段设置的重传计时器到期,提高整个网络吞吐量约20%。
快恢复算法:当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限
ssthresh
减半,与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh
减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
urllib2可以接受一个Request对象来为URL请求设置headers(请求头),urllib仅可以接受URL,不能伪装用户代理User Agent字符串等。
I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:
与多进程多线程相比,I/O多路复用技术的最大优势就是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减少了系统的开销。
(1)tornado:并发网络库,同时也是一个Web微框架
Tornado 适用于微服务,实现 Restful 接口
(2)gevent:绿色线程实现并发,猴子补丁修改内置socket
Gevnet高性能的并发网络库
(3)asyncio:python3 内置的并发网络库,基于原生的协程
Asyncio基于协程实现的内置并发网络库
后端只负责提供数据接口,不在渲染模版,前端从接口获取数据并呈现
优点:
缺点:
nginx相对apache的优点:
apache相对nginx的优点:
CGI通用网关接口,是连接web服务器和应用程序的接口,用户通过CGI来获取动态数据或文件等。CGI程序是一个独立的程序,它可以用几乎所有语言来写,包括perl/c/lua/python等。
WSGI(Web Server Gateway interface)是Python应用程序或者框架和Web服务器之间的一种接口,实现Web服务器与Web框架的交互,WSGI的其中一个目的就是让用户可以用统一的语言python编写前后端。
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络远程计算机程序上请求服务,而不需要了解底层网络技术。RPC协议假定某协议传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
SOAP(Simple Object Access Protocol)简单对象访问协议,是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间,以及不同应用程序之间按照HTTP通信协议,遵循XML格式执行资料互换,使其抽象于语言实现、平台和硬件。
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
REST(Representational State Transfer)表层状态转化,表现层其实指的是资源(Resources)的表现层,资源就是网络上一个实体或者一个具体信息,如一张图片,用特定的统一资源定位符(URI)指定;表现层(Representation)是指把资源呈现出来的形式,如文本可以用txt格式、html格式、xml格式、json格式、二进制格式等来表现;状态转化(State Transfer)客户端通过四个HTTP动词,对服务器端资源进行操作,实现表现层状态转化,如GET获取资源、POST新建更新资源、PUT用来更新资源、DELETE用来删除资源等。
RESTful架构一些典型的设计误区
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。
GET http://www.bank.com/account/123456
,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news
这个HTTP请求可能会每次请求得到不同的结果,但它本身没有产生任何副作用,因而是满足幂等性的。
DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如
DELETE http://forrum.com/article/4231
,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或者刷新页面而不用担心引起错误。
POST所对应的URI并非创建的资源本身,而是资源的接受者。比如
POST http://www.forum.com/articles
的语义是在http://www.forum.com/articles
下创建一篇文章,HTTP响应中包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。
PUT方法所对应的URI是要创建或更新的资源本身。比如
PUT http://www.forum/articles/4231
的语义是创建或者更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的,因此PUT方法具备幂等性。
持续跟新,更多网络基础知识,详见个人博客归纳。
欢迎留言补充,批评指正!