三次握手
客户端通过向服务器端发送一个请求报文SYN来创建一个主动打开。
Server端接受连接后回复ACK报文,并为这次连接分配资源。
如果只有两次通信的话,这时候B不确定A是否收到了确认消息,有可能这个确认消息由于某些原因丢了。
Client端接收到ACK报文后也向Server段发送报文,并分配资源,这样TCP连接就建立了。
这个时候经过了三次握手,A和B双方确认了两边都是通的,可以相互通信了,已经可以建立一个可靠的连接,并且可以相互发送数据。
这个时候已经不需要B再发送一个确认消息了,两边已经通过前三次建立了一个可靠的连接,如果再发送第四次确认消息的话,就浪费资源了。
四次挥手
注意: 中断连接端可以是客户端,也可以是服务器端. 下面仅以客户端断开连接举例, 反之亦然.
- 客户端发送一个FIN报文. 客户端进入 FIN-WAIT 状态. 该状态下客户端只接收数据, 不再发送数据.
- 服务器接收到带有 FIN = 1 的数据分段, 发送带有 ACK = 1 的剩余数据分段, 确认收到客户端发来的 FIN 信息.
- 服务器等到所有数据传输结束, 向客户端发送一个带有 FIN = 1 的数据分段, 并进入 CLOSE-WAIT 状态, 等待客户端发来带有 ACK = 1 的确认报文.
- 客户端收到服务器发来带有 FIN = 1 的报文, 返回 ACK = 1 的报文确认, 为了防止服务器端未收到需要重发, 进入 TIME-WAIT 状态. 服务器接收到报文后关闭连接. 客户端等待 2MSL 后未收到回复, 则认为服务器成功关闭, 客户端关闭连接。
注:MSL是报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。RFC规定为两分钟,实际应用中常用的是30秒,1分钟和2分钟。
图解: http://blog.csdn.net/whuslei/article/details/6667471
七层网络模型
网络通信的分层模型讲起:七层模型,也称OSI (Open System Interconnection)模型。
TCP和UDP对比
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 无连接,想发就发 |
是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
连接对象个数 | 只能是一对一通信 | 支持一对一,一对多,多对一和多对多交互通信 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
适用场景 | 适用于要求可靠传输的应用,例如文件传输 | 适用于实时应用(IP电话、视频会议、直播等) |
总结
- TCP向上层提供面向连接的可靠服务 ,UDP向上层提供无连接不可靠服务。
- 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为
- 对数据准确性要求高,速度可以相对较慢的,可以选用TCP
Socket(Ip address+ TCP/UDP + port)
套接字用于描述IP地址和端口,是一个通信链的句柄。应用程序通过套接字向网络发出请求或应答网络请求。注意的是套接字既不是程序也不是协议,只是操作系统提供给通信层的一组抽象API接口。
Socket=Ip address+ TCP/UDP + port
推荐: http://www.360doc.com/content/11/0609/15/5482098_122692444.shtml
使用Socket套接字需要传入哪些参数?
地址族(Address Family)
地址族通常作为 socket() 函数的第一个参数。
socket.AF_INET IPv4地址族,(host, port) 形式的二元组,host是一个表示网络主机的字符串,port为套接字的端口号。AF_INET对应的数值是:2。
socket.AF_INET6 (host, port, flowinfo, scopeid) 形式的四元组。AF_INET6对应的数值是:23。
套接字类型(Type)
套接字类型用于 socket() 函数的第二个参数。
但是只有 SOCK_STREAM (TCP)和 SOCK_DGRAM (UDP)是比较常见的。
怎么强行关闭客户端和服务器的连接
关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包(FIN,RST等),具体的交换过程可以看TCP协议。
而关闭socket是指关闭用户应用程序中的socket句柄,释放相关资源。但是当用户关闭socket句柄时会隐含的触发TCP连接的关闭过程。
TCP连接的关闭过程有两种,一种是优雅关闭(graceful close),一种是强制关闭(hard close或abortive close)
- 优雅关闭是指,如果发送缓存中还有数据未发出则其发出去,并且收到所有数据的ACK之后,发送FIN包,开始关闭过程。
- 强制关闭是指如果缓存中还有数据,则这些数据都将被丢弃,然后发送RST包,直接重置TCP连接。
shutdown函数,用于关闭TCP连接,但并不关闭socket句柄。
- SD_RECEIVE表明关闭接收通道,在该socket上不能再接收数据,如果当前接收缓存中仍有未取出数据或者以后再有数据到达,则TCP会向发送端发送RST包,将连接重置。
- SD_SEND表明关闭发送通道,TCP会将发送缓存中的数据都发送完毕并收到所有数据的ACK后向对端发送FIN包,表明本端没有更多数据发送。这个是一个优雅关闭过程。
- SD_BOTH则表示同时关闭接收通道和发送通道。
HTTP
HTTP状态码
状态码 | 定义 |
---|---|
1xx 报告 | 接收到请求,继续进程 |
2xx 成功 | 步骤成功接收,被理解,并被接受 |
3xx 重定向 | 为了完成请求,必须采取进一步措施 |
4xx 客户端出错 | 请求包括错的顺序或不能完成 |
5xx 服务器出错 | 服务器无法完成显然有效的请求 |
403: Forbidden
404: Not Found
HTTP1.0和HTTP1.1
推荐: http://blog.csdn.net/elifefly/article/details/3964766
HTTP 1.0*规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP1.1改进点
- 支持了长链接:在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
- HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求。但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
- 增加请求头Host字段:一个服务器多个虚拟Web站点。
- 身份认证,状态管理,Cache缓存等机制相关的请求头和响应头。
HTTP常见请求头与响应头
常见请求头:Request
Accept | 可接受的响应内容类型(Content-Types )。 |
Accept: text/plain |
固定 |
---|---|---|---|
Accept-Charset | 浏览器可接受的字符集 | Accept-Charset: utf-8 |
固定 |
Accept-Encoding | 可接受的响应内容的数据压缩格式 | Accept-Encoding: gzip, deflate |
固定 |
Accept-Language | 可接受的响应内容语言列表。 | Accept-Language: en-US |
固定 |
Accept-Datetime | 可接受的按照时间来表示的响应内容版本 | Accept-Datetime: Sat, 26 Dec 2015 17:30:00 GMT | 临时 |
Cache-Control | 用来指定当前的请求/回复中的,是否使用缓存机制。 |
常见响应头:Response
响应头 | 说明 | 示例 | 状态 |
---|---|---|---|
Age | 响应对象在代理缓存中存在的时间,以秒为单位 | Age: 12 |
固定 |
Cache-Control | 通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒 | Cache-Control: max-age=3600 |
固定 |
https://itbilu.com/other/relate/EJ3fKUwUx.html
https://juejin.im/post/6844903745004765198
HTTP协议以及协议头部中表示数据类型的字段
Accept | 可接受的响应内容类型(Content-Types )。 |
Accept: text/plain |
固定 |
---|---|---|---|
Accept-Charset | 浏览器可接受的字符集 | Accept-Charset: utf-8 |
固定 |
Accept-Encoding | 可接受的响应内容的数据压缩格式 | Accept-Encoding: gzip, deflate |
固定 |
Accept-Language | 可接受的响应内容语言列表。 | Accept-Language: en-US |
固定 |
HTTP请求方法
HTTP请求8种方法介绍
HTTP/1.1协议中共定义了8种HTTP请求方法,HTTP请求方法也被叫做“请求动作”,不同的方法规定了不同的操作指定的资源方式。服务端也会根据不同的请求方法做不同的响应。
- GET
GET请求会显示请求指定的资源。一般来说GET方法应该只用于数据的读取,而不应当用于会产生副作用的幂等的操作中。
GET会方法请求指定的页面信息,并返回响应主体,GET被认为是不安全的方法,因为GET方法会被网络蜘蛛等任意的访问。
- HEAD
HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。
- POST
POST请求会向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非幂等的方法,因为这个请求可能会创建新的资源或/和修改现有资源。
- PUT
PUT请求会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。
- DELETE
DELETE请求用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。
- CONNECT
CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。
- OPTIONS
OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用’*’来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。 允许
- TRACE
TRACE请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。
HTTP/1.1之后增加的方法
在HTTP/1.1标准制定之后,又陆续扩展了一些方法。其中使用中较多的是 PATCH 方法:
- PATCH
PATCH方法出现的较晚,它在2010年的RFC 5789标准中被定义。PATCH请求与PUT请求类似,同样用于资源的更新。二者有以下两点不同:
但PATCH一般用于资源的部分更新,而PUT一般用于资源的整体更新。
当资源不存在时,PATCH会创建一个新的资源,而PUT只会对已在资源进行更新。
Post和Get
GET和POST有什么区别?及为什么网上的多数答案都是错的
知乎回答
get: RFC 2616 - Hypertext Transfer Protocol — HTTP/1.1
post: RFC 2616 - Hypertext Transfer Protocol — HTTP/1.1
HTTP协议用法的约定,使用上的区别:
- GET使用URL或Cookie传参,而POST将数据放在BODY中。
- GET方式提交的数据长度有限,而POST的数据则可以非常大。(这个是因为它们使用的操作系统和浏览器设置的不同引起的区别。也不是GET和POST本身的区别。)
- POST比GET安全,因为数据在地址栏上不可见。
- 对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器端用Request.Form获取提交的数据
终极区别:
- GET请求是满足幂等性的,POST请求不是。所以不应该且不能用get请求做数据的增删改这些有副作用的操作。因为get请求是幂等的,在网络不好的隧道中会尝试重试。如果用get请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用。
什么是幂等性?简单来说意味着对同一URL的多个请求应该返回同样的结果。
幂等 Idempotence
HTTP方法的幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。(注意是副作用)
1.、HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
2、GET:向特定的资源发出请求数据。(要数据)
3、POST:向指定资源提交数据进行处理请求(给数据)(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
4、PUT:向指定资源位置上传其最新内容。
5、DELETE:请求服务器删除Request-URI所标识的资源。
如:
GET http://www.bank.com/account/123456
,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news
这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。
DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.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方法具有幂等性。
HTTP与HTTPS
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。(SSL: Secure Sockets Layer)
HTTPS和HTTP的区别主要如下:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
URL的形式
- 定义
URL(Uniform Resource Locator,统一资源定位符),定义资源在网上唯一的地址。
- 组成部分
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
- protocol(协议):
file 资源是本地计算机上的文件。格式file:///,注意后边应是三个斜杠。
ftp 通过 FTP访问资源。格式 FTP://
http 通过 HTTP 访问该资源。 格式
HTTP:// https 通过安全的 HTTPS 访问该资源。 格式 HTTPS://
mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto:
- hostname(主机名)
是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式: username:password@hostname)。
- Path(路径)
由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。parameters(参数)
- query(查询)
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP。NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
1 | //变量url即具有了url模块所提供的方法 |
1 | object |
urllib和urllib2的区别
这个面试官确实问过,当时答的urllib2可以Post而urllib不可以.
- urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
- urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的用户代理字符串等。
ARP协议
地址解析协议(Address Resolution Protocol),其基本功能为透过目标设备的IP地址,查询目标的MAC地址,以保证通信的顺利进行。它是IPv4网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代(Neighbor Discovery Protocol)。
Cookie和Session
Cookie | Session | |
---|---|---|
储存位置 | 客户端 | 服务器端 |
目的 | 跟踪会话,也可以保存用户偏好设置或者保存用户名密码等 | 跟踪会话 |
安全性 | 不安全 | 安全 |
session技术是要使用到cookie的,之所以出现session技术,主要是为了安全。
但是禁用Cookie就不能得到Session。因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于SessionID,也就得不到Session。
apache和nginx的区别(Web服务器)
nginx 相对 apache 的优点:
- 轻量级,同样起web 服务,比apache 占用更少的内存及资源
- 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
- 配置简洁
- 高度模块化的设计,编写模块相对简单
- 社区活跃
apache 相对nginx 的优点:
rewrite ,比nginx 的rewrite 强大
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多
超稳定
网站用户密码保存
- 明文保存在数据库中
- 明文hash后保存,如MD5
- MD5+Salt方式,这个Salt可以随机
- 知乎使用了Bcrypy(好像)加密
浏览器缓存
推荐: http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html
304 Not Modified
浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如:Expires;Cache-control等)
但是也有非HTTP协议定义的缓存机制。
一、非HTTP协议定义的缓存机制
1 | <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> |
上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。
二、HTTP协议定义的缓存机制
Expires策略: 是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
Cache-control策略:Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。
CSRF和XSS
- CSRF(Cross-site request forgery)跨站请求伪造:网站过分信任用户,放任来自所谓通过访问控制机制的代表合法用户的请求执行网站的某个特定功能。(利用cookies进行CSRF攻击)
- XSS(Cross Site Scripting)跨站脚本攻击:用户过分信任网站,放任来自来自浏览器地址代表的那个网站代码在自己本地任意执行。如果没有浏览器的安全机制限制,XSS代码可以在用户浏览器为所欲为。
CSRF重点在请求,XSS重点在脚本
RPC
RPC(Remote Procedure Call Protocol)——远程过程调用协议。
该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC是一个分布式计算的CS模式,总是由Client向Server发出一个执行若干过程请求,Server接受请求,使用客户端提供的参数,计算完成之后将结果返回给客户端。
RPC是面向过程,Restful是面向资源,并且使用了Http动词。从这个维度上看,Restful风格的url在表述的精简性、可读性上都要更好。
1 | # RPC风格 |
RPC原理:
比如 A (client) 调用 B (server) 提供的remoteAdd
方法:
- 首先A与B之间建立一个TCP连接;
- 然后A把需要调用的方法名(这里是remoteAdd)以及方法参数(10, 20)序列化成字节流发送出去;
- B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回;
- A接受远程调用结果,输出30。
进化的顺序: RPC -> SOAP -> RESTful
SOAP
- SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息。
- SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间。不同应用程序之间按照HTTP通信协议,遵从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。
RESTful架构(SOAP,RPC)
推荐: http://www.ruanyifeng.com/blog/2011/09/restful.html
Representational State Transfer:表现层状态转移
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
总结一下什么是RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化“。
CGI和WSGI
CGI(Common Gateway Interface)是通用网关接口,是连接web服务器和应用程序的接口,用户通过CGI来获取动态数据或文件等。
CGI程序是一个独立的程序,它可以用几乎所有语言来写,包括perl,c,lua,python等等。WSGI(Web Server Gateway Interface)Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,WSGI的其中一个目的就是让用户可以用统一的语言(Python)编写前后端。
它不是服务器,也不是python模块,它是一种规范,描述Web服务器和应用之间的交互.通俗来讲, 它就是一条纽带,连接着Web服务器和应用。
官方说明:PEP-3333
简述浏览器通过WSGI请求动态资源的过程
- 静态服务器加载的是一个静态html页面,或是存在服务器中的静态数据。
动态服务器是,当客户端发送一个请求,服务器拿到这个请求找到相关的程序代码执行,将执行结果返回给客户端的一个过程
WSGI
怎么在你刚刚建立的web服务器上运行一个Django应用和一个Flask应用呢。如何做不做任何改变而适应不同的web架构呢:WSGI
- 浏览器发送http请求动态资源给web服务器(flask)
- web服务器收到请求后通过WSGI调用一个属性给应用程序框架
- 应用程序框架通过引用WSGI调用Web服务器,设置返回的状态和头信息
- 调用后返回,此时Web服务器保存了刚刚设置的信息
- 应用程序查询数据库,生成动态页面的body信息
- 把生成的body信息返回给Web服务器
- Web服务器把数据返回给浏览器
WSGI与Flask之间的关系
- 使用
app.run()
方法来启动flask应用(app.run()
代码隐藏着创建一个服务器),app应用本身会作为参数传递到WSGI服务器中。 - 在客户端(这里就是浏览器)输入网址(发送一个请求),服务器使用WSGI 中间件来处理这个请求。
- WSGI 处理请求对应着
wsgi_app(self, environ, start_response)
方法,self
参数对应着app
,即flask程序;environ
和start_response
由服务器提供。 wsgi_app()
作用就是调用各种请求处理函数来处理请求,然后返回处理结果。即用户输入网址后,看到了网页响应。
1 | from flask import Flask |
https://blog.csdn.net/sinat_36651044/article/details/77462831
中间人攻击
在GFW(Great Firewall: 中国国家防火墙)里屡见不鲜的,呵呵.
中间人攻击(Man-in-the-middle attack,通常缩写为MITM)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。
c10k问题
所谓c10k问题,指的是服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是c10k这个名字的由来)。
解决方法:
- 每个连接分配一个独立的线程/进程:该思路最为直接,但是申请进程/线程是需要系统资源的,且系统需要管理这些进程/线程,所以会使资源占用过多,可扩展性差
- 同一个线程/进程同时处理多个连接(I/O多路复用):select方式、poll方式、epoll方式、异步I/O以及Windows
https://my.oschina.net/xianggao/blog/664275
Ajax
AJAX(Asynchronous JavaScript and XML)(异步的 JavaScript 和 XML), 是与在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。
描述用浏览器访问www.baidu.com的过程
- 浏览器获取用户输入的域名:www.baidu.com
浏览器向域名解析器DNS获取www.baidu.com的IP地址
DNS解析出IP地址
- 浏览器与服务器建立TCP连接(默认端口号80)
浏览器发出HTTP请求,请求百度页面
服务器通过HTTP响应把首页内容发送给浏览器
TCP连接释放
- 浏览器解析首页文件,并将WEB页面显示给用户
简述QQ登陆过程
qq登录,在我们的项目中分为了三个接口
第一个接口是请求qq服务器返回一个qq登录的界面;
第二个接口是通过扫码或账号登陆进行验证,qq服务器返回给浏览器一个code和state, 利用这个code通过本地服务器去向qq服务器获取access_token,凭借access_token再向qq服务器获取用户的openid(openid用户的唯一标识)
第三个接口是判断用户是否是第一次qq登录,如果不是的话直接登录返回的jwt-token给用户,对没有绑定过本网站的用户,对openid进行加密生成token进行绑定