本文曾经收录到Github仓库,该仓库蕴含计算机根底、Java根底、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等外围知识点,欢送star~
Github地址:https://github.com/Tyson0314/...
网络分层构造
计算机网络体系大抵分为三种,OSI七层模型、TCP/IP四层模型和五层模型。个别面试的时候考查比拟多的是五层模型。
五层模型:应用层、传输层、网络层、数据链路层、物理层。
- 应用层:为应用程序提供交互服务。在互联网中的应用层协定很多,如域名零碎DNS、HTTP协定、SMTP协定等。
- 传输层:负责向两台主机过程之间的通信提供数据传输服务。传输层的协定次要有传输控制协议TCP和用户数据协定UDP。
- 网络层:抉择适合的路由和替换结点,确保数据及时传送。次要包含IP协定。
- 数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
- 物理层:实现相邻节点间比特流的通明传输,尽可能屏蔽传输介质和物理设施的差别。
ISO七层模型是国际标准化组织(International Organization for Standardization)制订的一个用于计算机或通信零碎间互联的规范体系。
- 应用层:网络服务与最终用户的一个接口,常见的协定有:HTTP FTP SMTP SNMP DNS.
- 表示层:数据的示意、平安、压缩。,确保一个零碎的应用层所发送的信息能够被另一个零碎的应用层读取。
- 会话层:建设、治理、终止会话,对应主机过程,指本地主机与近程主机正在进行的会话.
- 传输层:定义传输数据的协定端口号,以及流控和过错校验,协定有TCP UDP.
- 网络层:进行逻辑地址寻址,实现不同网络之间的门路抉择,协定有ICMP IGMP IP等.
- 数据链路层:在物理层提供比特流服务的根底上,建设相邻结点之间的数据链路。
- 物理层:建设、保护、断开物理连贯。
TCP/IP 四层模型
- 应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
- 传输层: 对应OSI的传输层,为应用层实体提供端到端的通信性能,保障了数据包的程序传送及数据的完整性。
- 网际层:对应于OSI参考模型的网络层,次要解决主机到主机的通信问题。
- 网络接口层:与OSI参考模型的数据链路层、物理层对应。
三次握手
假如发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSED
。
- 第一次握手:客户端向服务端发动建设连贯申请,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中蕴含标记位
SYN=1
,序列号seq=x
。第一次握手前客户端的状态为CLOSE
,第一次握手后客户端的状态为SYN-SENT
。此时服务端的状态为LISTEN
。 - 第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号y,而后给客户端回复一段报文,其中包含标记位
SYN=1
,ACK=1
,序列号seq=y
,确认号ack=x+1
。第二次握手前服务端的状态为LISTEN
,第二次握手后服务端的状态为SYN-RCVD
,此时客户端的状态为SYN-SENT
。(其中SYN=1
示意要和客户端建设一个连贯,ACK=1
示意确认序号无效) - 第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中蕴含标记位
ACK=1
,序列号seq=x+1
,确认号ack=y+1
。第三次握手前客户端的状态为SYN-SENT
,第三次握手后客户端和服务端的状态都为ESTABLISHED
。此时连贯建设实现。
两次握手能够吗?
之所以须要第三次握手,次要为了避免已生效的连贯申请报文段忽然又传输到了服务端,导致产生问题。
- 比方客户端A收回连贯申请,可能因为网络阻塞起因,A没有收到确认报文,于是A再重传一次连贯申请。
- 而后连贯胜利,期待数据传输结束后,就开释了连贯。
- 而后A收回的第一个连贯申请等到连贯开释当前的某个工夫才达到服务端B,此时B误认为A又收回一次新的连贯申请,于是就向A收回确认报文段。
- 如果不采纳三次握手,只有B收回确认,就建设新的连贯了,此时A不会响应B的确认且不发送数据,则B始终期待A发送数据,浪费资源。
四次挥手
- A的利用过程先向其TCP收回连贯开释报文段(
FIN=1,seq=u
),并进行再发送数据,被动敞开TCP连贯,进入FIN-WAIT-1
(终止期待1)状态,期待B的确认。 - B收到连贯开释报文段后即收回确认报文段(
ACK=1,ack=u+1,seq=v
),B进入CLOSE-WAIT
(敞开期待)状态,此时的TCP处于半敞开状态,A到B的连贯开释。 - A收到B的确认后,进入
FIN-WAIT-2
(终止期待2)状态,期待B收回的连贯开释报文段。 - B发送完数据,就会收回连贯开释报文段(
FIN=1,ACK=1,seq=w,ack=u+1
),B进入LAST-ACK
(最初确认)状态,期待A的确认。 - A收到B的连贯开释报文段后,对此收回确认报文段(
ACK=1,seq=u+1,ack=w+1
),A进入TIME-WAIT
(工夫期待)状态。此时TCP未开释掉,须要通过工夫期待计时器设置的工夫2MSL
(最大报文段生存工夫)后,A才进入CLOSED
状态。B收到A收回的确认报文段后敞开连贯,若没收到A收回的确认报文段,B就会重传连贯开释报文段。
第四次挥手为什么要期待2MSL?
- 保障A发送的最初一个ACK报文段可能达到B。这个
ACK
报文段有可能失落,B收不到这个确认报文,就会超时重传连贯开释报文段,而后A能够在2MSL
工夫内收到这个重传的连贯开释报文段,接着A重传一次确认,重新启动2MSL计时器,最初A和B都进入到CLOSED
状态,若A在TIME-WAIT
状态不期待一段时间,而是发送完ACK报文段后立刻开释连贯,则无奈收到B重传的连贯开释报文段,所以不会再发送一次确认报文段,B就无奈失常进入到CLOSED
状态。 - 避免已生效的连贯申请报文段呈现在本连贯中。A在发送完最初一个
ACK
报文段后,再通过2MSL,就能够使这个连贯所产生的所有报文段都从网络中隐没,使下一个新的连贯中不会呈现旧的连贯申请报文段。
为什么是四次挥手?
因为当Server端收到Client端的SYN
连贯申请报文后,能够间接发送SYN+ACK
报文。然而在敞开连贯时,当Server端收到Client端收回的连贯开释报文时,很可能并不会立刻敞开SOCKET,所以Server端先回复一个ACK
报文,通知Client端我收到你的连贯开释报文了。只有等到Server端所有的报文都发送完了,这时Server端能力发送连贯开释报文,之后两边才会真正的断开连接。故须要四次挥手。
TCP有哪些特点?
- TCP是面向连贯的运输层协定。
- 点对点,每一条TCP连贯只能有两个端点。
- TCP提供牢靠交付的服务。
- TCP提供全双工通信。
- 面向字节流。
说说TCP报文首部有哪些字段,其作用又别离是什么?
- 16位端口号:源端口号,主机该报文段是来自哪里;指标端口号,要传给哪个下层协定或应用程序
- 32位序号:一次TCP通信(从TCP连贯建设到断开)过程中某一个传输方向上的字节流的每个字节的编号。
- 32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。
- 4位头部长度:示意tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
- 6位标记位:URG(紧急指针是否无效),ACk(示意确认号是否无效),PSH(缓冲区尚未填满),RST(示意要求对方从新建设连贯),SYN(建设连贯音讯标记接),FIN(示意告知对方本端要敞开连贯了)
- 16位窗口大小:是TCP流量管制的一个伎俩。这里说的窗口,指的是接管通告窗口。它通知对方本端的TCP接收缓冲区还能包容多少字节的数据,这样对方就能够管制发送数据的速度。
- 16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以测验TCP报文段在传输过程中是否损坏。留神,这个校验不仅包含TCP头部,也包含数据局部。这也是TCP牢靠传输的一个重要保障。
- 16位紧急指针:一个正的偏移量。它和序号字段的值相加示意最初一个紧急数据的下一字节的序号。因而,确切地说,这个字段是紧急指针绝对以后序号的偏移,无妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的办法。
TCP和UDP的区别?
- TCP面向连贯;UDP是无连贯的,即发送数据之前不须要建设连贯。
- TCP提供牢靠的服务;UDP不保障牢靠交付。
- TCP面向字节流,把数据看成一连串无构造的字节流;UDP是面向报文的。
- TCP有拥塞管制;UDP没有拥塞管制,因而网络呈现拥塞不会使源主机的发送速率升高(对实时利用很有用,如实时视频会议等)。
- 每一条TCP连贯只能是点到点的;UDP反对一对一、一对多、多对一和多对多的通信形式。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
TCP 和 UDP 别离对应的常见应用层协定有哪些?
基于TCP的应用层协定有:HTTP、FTP、SMTP、TELNET、SSH
- HTTP:HyperText Transfer Protocol(超文本传输协定),默认端口80
- FTP: File Transfer Protocol (文件传输协定), 默认端口(20用于传输数据,21用于传输管制信息)
- SMTP: Simple Mail Transfer Protocol (简略邮件传输协定) ,默认端口25
- TELNET: Teletype over the Network (网络电传), 默认端口23
- SSH:Secure Shell(平安外壳协定),默认端口 22
基于UDP的应用层协定:DNS、TFTP、SNMP
- DNS : Domain Name Service (域名服务),默认端口 53
- TFTP: Trivial File Transfer Protocol (简略文件传输协定),默认端口69
- SNMP:Simple Network Management Protocol(简略网络管理协定),通过UDP端口161接管,只有Trap信息采纳UDP端口162。
TCP的粘包和拆包
TCP是面向流,没有界线的一串数据。TCP底层并不理解下层业务数据的具体含意,它会依据TCP缓冲区的理论状况进行包的划分,所以在业务上认为,一个残缺的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
为什么会产生粘包和拆包呢?
- 要发送的数据小于TCP发送缓冲区的大小,TCP将屡次写入缓冲区的数据一次发送进来,将会产生粘包;
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将产生粘包;
- 要发送的数据大于TCP发送缓冲区残余空间大小,将会产生拆包;
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。
解决方案:
- 发送端将每个数据包封装为固定长度
- 在数据尾部减少特殊字符进行宰割
- 将数据分为两局部,一部分是头部,一部分是内容体;其中头部构造大小固定,且有一个字段申明内容体的大小。
说说TCP是如何确保可靠性的呢?
- 首先,TCP的连贯是基于三次握手,而断开则是基于四次挥手。确保连贯和断开的可靠性。
- 其次,TCP的可靠性,还体现在有状态;TCP会记录哪些数据发送了,哪些数据被接管了,哪些没有被承受,并且保障数据包按序达到,保障数据传输不出差错。
- 再次,TCP的可靠性,还体现在可管制。它有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接管方)、抛弃反复数据、流量管制(滑动窗口)和拥塞管制等机制。
说下TCP的滑动窗口机制
TCP 利用滑动窗口实现流量管制。流量管制是为了管制发送方发送速率,保障接管方来得及接管。 TCP会话的单方都各自保护一个发送窗口和一个接管窗口。接管窗口大小取决于利用、零碎、硬件的限度。发送窗口则取决于对端通告的接管窗口。接管方发送的确认报文中的window字段能够用来管制发送方窗口大小,从而影响发送方的发送速率。将接管方的确认报文window字段设置为 0,则发送方不能发送数据。
TCP头蕴含window字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端通知发送端本人还有多少缓冲区能够接收数据。于是发送端就能够依据这个接收端的解决能力来发送数据,而不会导致接收端解决不过去。接管窗口的大小是约等于发送窗口的大小。
具体讲一下拥塞管制?
避免过多的数据注入到网络中。 几种拥塞管制办法:慢开始( slow-start )、拥塞防止( congestion avoidance )、快重传( fast retransmit )和快复原( fast recovery )。
慢开始
把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口减少至少一个MSS的数值。每通过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了避免拥塞窗口cwnd增长过大引起网络拥塞,还须要设置一个慢开始门限ssthresh状态变量。
当 cwnd < ssthresh 时,应用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞防止算法。
当 cwnd = ssthresh 时,既可应用慢开始算法,也可应用拥塞管制防止算法。
拥塞防止
让拥塞窗口cwnd迟缓地增大,每通过一个往返工夫RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性法则迟缓增长。
无论在慢开始阶段还是在拥塞防止阶段,只有发送方判断网络呈现拥塞(其依据就是没有收到确认),就要把慢开始门限ssthresh设置为呈现拥塞时的发送 方窗口值的一半(但不能小于2)。而后把拥塞窗口cwnd从新设置为1,执行慢开始算法。这样做的目标就是要迅速缩小主机发送到网络中的分组数,使得产生 拥塞的路由器有足够工夫把队列中积压的分组处理完毕。
快重传
有时个别报文段会在网络中失落,但实际上网络并未产生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络产生了拥塞。这就导致发送方谬误地启动慢开始,把拥塞窗口cwnd又设置为1,因此升高了传输效率。
快重传算法能够防止这个问题。快重传算法首先要求接管方每收到一个失序的报文段后就立刻收回反复确认,使发送方及早晓得有报文段没有达到对方。
发送方只有一连收到三个反复确认就该当立刻重传对方尚未收到的报文段,而不用持续期待重传计时器到期。因为发送方尽早重传未被确认的报文段,因而采纳快重传后能够使整个网络吞吐量进步约20%。
快复原
当发送方间断收到三个反复确认,就会把慢开始门限ssthresh减半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,而后开始执行拥塞防止算法,使拥塞窗口迟缓地线性增大。
在采纳快复原算法时,慢开始算法只是在TCP连贯建设时和网络呈现超时时才应用。 采纳这样的拥塞管制办法使得TCP的性能有显著的改良。
HTTP协定的特点?
- HTTP容许传输任意类型的数据。传输的类型由Content-Type加以标记。
- 无状态。对于客户端每次发送的申请,服务器都认为是一个新的申请,上一次会话和下一次会话之间没有分割。
- 反对客户端/服务器模式。
HTTP报文格式
HTTP申请由申请行、申请头部、空行和申请体四个局部组成。
- 申请行:包含申请办法,拜访的资源URL,应用的HTTP版本。
GET
和POST
是最常见的HTTP办法,除此以外还包含DELETE、HEAD、OPTIONS、PUT、TRACE
。 - 申请头:格局为“属性名:属性值”,服务端依据申请头获取客户端的信息,次要有
cookie、host、connection、accept-language、accept-encoding、user-agent
。 - 申请体:用户的申请数据如用户名,明码等。
申请报文示例:
POST /xxx HTTP/1.1 申请行Accept:image/gif.image/jpeg, 申请头部Accept-Language:zh-cnConnection:Keep-AliveHost:localhostUser-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)Accept-Encoding:gzip,deflateusername=dabin 申请体
HTTP响应也由四个局部组成,别离是:状态行、响应头、空行和响应体。
- 状态行:协定版本,状态码及状态形容。
- 响应头:响应头字段次要有
connection、content-type、content-encoding、content-length、set-cookie、Last-Modified,、Cache-Control、Expires
。 - 响应体:服务器返回给客户端的内容。
响应报文示例:
HTTP/1.1 200 OKServer:Apache Tomcat/5.0.12Date:Mon,6Oct2003 13:23:42 GMTContent-Length:112<html> <body>响应体</body></html>
HTTP状态码有哪些?
HTTP 状态码是服务器端返回给客户端的响应状态码,依据状态码咱们就能晓得服务器端想要给客户端表白的具体含意,比方 200 就示意申请拜访胜利,500 就示意服务器端程序出错等。HTTP 状态码可分为 5 大类:
- 1XX:音讯状态码。
- 2XX:胜利状态码。
- 3XX:重定向状态码。
- 4XX:客户端谬误状态码。
- 5XX:服务端谬误状态码。
这 5 大类中又蕴含了很多具体的状态码。
1XX为音讯状态码,其中:
- 100:Continue 持续。客户端应持续其申请。
- 101:Switching Protocols 切换协定。服务器依据客户端的申请切换协定。只能切换到更高级的协定,例如,切换到 HTTP 的新版本协定。
2XX为胜利状态码,其中:
- 200:OK 申请胜利。个别用于 GET 与 POST 申请。
- 201:Created 已创立。胜利申请并创立了新的资源。
- 202:Accepted 已承受。曾经承受申请,但未解决实现。
- 203:Non-Authoritative Information 非受权信息。申请胜利。但返回的 meta 信息不在原始的服务器,而是一个正本。
- 204:No Content 无内容。服务器胜利解决,但未返回内容。在未更新网页的状况下,可确保浏览器持续显示以后文档。
- 205:Reset Content 重置内容。服务器解决胜利,用户终端(例如:浏览器)应重置文档视图。可通过此返回码革除浏览器的表单域。
- 206:Partial Content 局部内容。服务器胜利解决了局部 GET 申请。
3XX为重定向状态码,其中:
- 300:Multiple Choices 多种抉择。申请的资源可包含多个地位,相应可返回一个资源特色与地址的列表用于用户终端(例如:浏览器)抉择。
- 301:Moved Permanently 永恒挪动。申请的资源已被永恒的挪动到新 URI,返回信息会包含新的 URI,浏览器会主动定向到新 URI。今后任何新的申请都应应用新的 URI 代替。
- 302:Found 长期挪动,与 301 相似。但资源只是长期被挪动。客户端应持续应用原有URI。
- 303:See Other 查看其它地址。与 301 相似。应用 GET 和 POST 申请查看。
- 304:Not Modified 未修改。所申请的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存拜访过的资源,通过提供一个头信息指出客户端心愿只返回在指定日期之后批改的资源。
- 305:Use Proxy 应用代理。所申请的资源必须通过代理拜访。
- 306:Unused 曾经被废除的 HTTP 状态码。
- 307:Temporary Redirect 长期重定向。与 302 相似。应用 GET 申请重定向。
4XX为客户端谬误状态码,其中:
- 400:Bad Request 客户端申请的语法错误,服务器无奈了解。
- 401:Unauthorized 申请要求用户的身份认证。
- 402:Payment Required 保留,未来应用。
- 403:Forbidden 服务器了解申请客户端的申请,然而拒绝执行此申请。
- 404:Not Found 服务器无奈依据客户端的申请找到资源(网页)。通过此代码,网站设计人员可设置"您所申请的资源无奈找到"的共性页面。
- 405:Method Not Allowed 客户端申请中的办法被禁止。
- 406:Not Acceptable 服务器无奈依据客户端申请的内容个性实现申请。
- 407:Proxy Authentication Required 申请要求代理的身份认证,与 401 相似,但请求者该当应用代理进行受权。
- 408:Request Time-out 服务器期待客户端发送的申请工夫过长,超时。
- 409:Conflict 服务器实现客户端的 PUT 申请时可能返回此代码,服务器解决申请时产生了抵触。
- 410:Gone 客户端申请的资源曾经不存在。410 不同于 404,如果资源以前有当初被永恒删除了可应用 410 代码,网站设计人员可通过 301 代码指定资源的新地位。
- 411:Length Required 服务器无奈解决客户端发送的不带 Content-Length 的申请信息。
- 412:Precondition Failed 客户端申请信息的先决条件谬误。
- 413:Request Entity Too Large 因为申请的实体过大,服务器无奈解决,因而拒绝请求。为避免客户端的间断申请,服务器可能会敞开连贯。如果只是服务器临时无奈解决,则会蕴含一个 Retry-After 的响应信息。
- 414:Request-URI Too Large 申请的 URI 过长(URI通常为网址),服务器无奈解决。
- 415:Unsupported Media Type 服务器无奈解决申请附带的媒体格式。
- 416:Requested range not satisfiable 客户端申请的范畴有效。
- 417:Expectation Failed 服务器无奈满足 Expect 的申请头信息。
5XX为服务端谬误状态码,其中:
- 500:Internal Server Error 服务器外部谬误,无奈实现申请。
- 501:Not Implemented 服务器不反对申请的性能,无奈实现申请。
- 502:Bad Gateway 作为网关或者代理工作的服务器尝试执行申请时,从近程服务器接管到了一个有效的响应。
- 503:Service Unavailable 因为超载或系统维护,服务器临时的无奈解决客户端的申请。延时的长度可蕴含在服务器的Retry-After头信息中。
- 504:Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取申请。
- 505:HTTP Version not supported 服务器不反对申请的HTTP协定的版本,无奈实现解决。
总结一下:
HTTP 状态码分为 5 大类:1XX:示意音讯状态码;2XX:示意胜利状态码;3XX:示意重定向状态码;4XX:示意客户端谬误状态码;5XX:示意服务端谬误状态码。其中常见的具体状态码有:200:申请胜利;301:永恒重定向;302:长期重定向;404:无奈找到此页面;405:申请的办法类型不反对;500:服务器外部出错。
HTTP 协定包含哪些申请?
HTTP协定中共定义了八种办法来示意对Request-URI指定的资源的不同操作形式,具体如下:
- GET:向特定的资源发出请求。
- POST:向指定资源提交数据进行解决申请(例如提交表单或者上传文件)。数据被蕴含在申请体中。POST申请可能会导致新的资源的创立和/或已有资源的批改。
- OPTIONS:返回服务器针对特定资源所反对的HTTP申请办法。也能够利用向Web服务器发送'*'的申请来测试服务器的功能性。
- HEAD:向服务器索要与GET申请相一致的响应,只不过响应体将不会被返回。这一办法能够在不用传输整个响应内容的状况下,就能够获取蕴含在响应音讯头中的元信息。
- PUT:向指定资源地位上传其最新内容。
- DELETE:申请服务器删除Request-URI所标识的资源。
- TRACE:回显服务器收到的申请,次要用于测试或诊断。
- CONNECT:HTTP/1.1协定中预留给可能将连贯改为管道形式的代理服务器。
HTTP状态码301和302的区别?
- 301:(永久性转移)申请的网页已被永恒挪动到新地位。服务器返回此响应时,会主动将请求者转到新地位。
- 302:(暂时性转移)服务器目前正从不同地位的网页响应申请,但请求者应持续应用原有地位来进行当前的申请。此代码与响应GET和HEAD申请的301代码相似,会主动将请求者转到不同的地位。
举个形象的例子:当一个网站或者网页24—48小时内长期挪动到一个新的地位,这时候就要进行302跳转,打个比方说,我有一套房子,然而最近走亲戚去亲戚家住了,过两天我还回来的。而应用301跳转的场景就是之前的网站因为某种原因须要移除掉,而后要到新的地址拜访,是永久性的,就比方你的那套房子其实是租的,当初租期到了,你又在另一个中央找到了房子,之前租的房子不住了。
URI和URL的区别
- URI,全称是Uniform Resource Identifier),中文翻译是对立资源标志符,次要作用是惟一标识一个资源。
- URL,全称是Uniform Resource Location),中文翻译是对立资源定位符,次要作用是提供资源的门路。打个经典比喻吧,URI像是身份证,能够惟一标识一个人,而URL更像一个住址,能够通过URL找到这个人。
POST和GET的区别?
- GET 和 POST 最实质的区别是标准上的区别,在标准中,定义 GET 申请是用来获取资源的,也就是进行查问操作的,而 POST 申请是用来传输实体对象的,因而会应用 POST 来进行增加、批改和删除等操作。
- GET申请参数通过URL传递,POST的参数放在申请体中。
- GET 申请能够间接进行回退和刷新,不会对用户和程序产生任何影响;而 POST 申请如果间接回滚和刷新将会把数据再次提交。
- GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET形式的申请,浏览器会把申请头和申请体一并发送进来;而对于POST,浏览器先发送申请头,服务器响应100 continue,浏览器再发送申请体。
- GET 申请个别会被缓存,比方常见的 CSS、JS、HTML 申请等都会被缓存;而 POST 申请默认是不进行缓存的。
- GET申请参数会被残缺保留在浏览器历史记录里,而POST中的参数不会被保留。
如何了解HTTP协定是无状态的
当浏览器第一次发送申请给服务器时,服务器响应了;如果同个浏览器发动第二次申请给服务器时,它还是会响应,然而呢,服务器不晓得你就是方才的那个浏览器。简言之,服务器不会去记住你是谁,所以是无状态协定。
HTTP长连贯和短连贯?
HTTP短连贯:浏览器和服务器每进行一次HTTP操作,就建设一次连贯,工作完结就中断连贯。HTTP1.0默认应用的是短连贯。
HTTP长连贯:指的是复用TCP连贯。多个HTTP申请能够复用同一个TCP连贯,这就节俭了TCP连贯建设和断开的耗费。
HTTP/1.1起,默认应用长连贯。要应用长连贯,客户端和服务器的HTTP首部的Connection都要设置为keep-alive,能力反对长连贯。
HTTP 如何实现长连贯?
HTTP分为长连贯和短连贯,实质上说的是TCP的长短连贯。TCP连贯是一个双向的通道,它是能够放弃一段时间不敞开的,因而TCP连贯才具备真正的长连贯和短连贯这一说法哈。
TCP长连贯能够复用一个TCP连贯,来发动屡次的HTTP申请,这样就能够缩小资源耗费,比方一次申请HTML,如果是短连贯的话,可能还须要申请后续的JS/CSS。
如何设置长连贯?
通过在头部(申请和响应头)设置Connection字段指定为keep-alive
,HTTP/1.0协定反对,然而是默认敞开的,从HTTP/1.1当前,连贯默认都是长连贯。
HTTP长连贯在什么时候会超时?
HTTP个别会有httpd守护过程,外面能够设置keep-alive timeout,当tcp连贯闲置超过这个工夫就会敞开,也能够在HTTP的header外面设置超时工夫。
TCP 的keep-alive蕴含三个参数,反对在零碎内核的net.ipv4外面设置;当 TCP 连贯之后,闲置了tcp_keepalive_time,则会产生侦测包,如果没有收到对方的ACK,那么会每隔 tcp_keepalive_intvl再发一次,直到发送了tcp_keepalive_probes,就会抛弃该连贯。
HTTP1.1和 HTTP2.0的区别?
HTTP2.0相比HTTP1.1反对的个性:
- 新的二进制格局:HTTP1.1 基于文本格式传输数据;HTTP2.0采纳二进制格局传输数据,解析更高效。
- 多路复用:在一个连贯里,容许同时发送多个申请或响应,并且这些申请或响应可能并行的传输而不被阻塞,防止 HTTP1.1 呈现的”队头梗塞”问题。
- 头部压缩,HTTP1.1的header带有大量信息,而且每次都要反复发送;HTTP2.0 把header从数据中拆散,并封装成头帧和数据帧,应用特定算法压缩头帧,无效缩小头信息大小。并且HTTP2.0在客户端和服务器端记录了之前发送的键值对,对于雷同的数据,不会反复发送。比方申请a发送了所有的头信息字段,申请b则只须要发送差别数据,这样能够缩小冗余数据,升高开销。
- 服务端推送:HTTP2.0容许服务器向客户端推送资源,无需客户端发送申请到服务器获取。
HTTPS与HTTP的区别?
- HTTP是超文本传输协定,信息是明文传输;HTTPS则是具备安全性的ssl加密传输协定。
- HTTP和HTTPS用的端口不一样,HTTP端口是80,HTTPS是443。
- HTTPS协定须要到CA机构申请证书,个别须要肯定的费用。
- HTTP运行在TCP协定之上;HTTPS运行在SSL协定之上,SSL运行在TCP协定之上。
什么是数字证书?
服务端能够向证书颁发机构CA申请证书,以防止中间人攻打(避免证书被篡改)。证书蕴含三局部内容:证书内容、证书签名算法和签名,签名是为了验证身份。
服务端把证书传输给浏览器,浏览器从证书里取公钥。证书能够证实该公钥对应本网站。
数字签名的制作过程:
- CA应用证书签名算法对证书内容进行hash运算。
- 对hash后的值用CA的私钥加密,失去数字签名。
浏览器验证过程:
- 获取证书,失去证书内容、证书签名算法和数字签名。
- 用CA机构的公钥对数字签名解密(因为是浏览器信赖的机构,所以浏览器会保留它的公钥)。
- 用证书里的签名算法对证书内容进行hash运算。
- 比拟解密后的数字签名和对证书内容做hash运算后失去的哈希值,相等则表明证书可信。
HTTPS原理
首先是TCP三次握手,而后客户端发动一个HTTPS连贯建设申请,客户端先发一个Client Hello
的包,而后服务端响应Server Hello
,接着再给客户端发送它的证书,而后单方通过密钥替换,最初应用替换的密钥加解密数据。
协商加密算法 。在
Client Hello
外面客户端会告知服务端本人以后的一些信息,包含客户端要应用的TLS版本,反对的加密算法,要拜访的域名,给服务端生成的一个随机数(Nonce)等。须要提前告知服务器想要拜访的域名以便服务器发送相应的域名的证书过去。服务端响应
Server Hello
,通知客户端服务端选中的加密算法。接着服务端给客户端发来了2个证书。第二个证书是第一个证书的签发机构(CA)的证书。
客户端应用证书的认证机构CA公开公布的RSA公钥对该证书进行验证,下图表明证书认证胜利。
验证通过之后,浏览器和服务器通过密钥替换算法产生共享的对称密钥。
开始传输数据,应用同一个对称密钥来加解密。
DNS 的解析过程?
- 浏览器搜寻本人的DNS缓存
- 若没有,则搜寻操作系统中的DNS缓存和hosts文件
- 若没有,则操作系统将域名发送至本地域名服务器,本地域名服务器查问本人的DNS缓存,查找胜利则返回后果,否则顺次向根域名服务器、顶级域名服务器、权限域名服务器发动查问申请,最终返回IP地址给本地域名服务器
- 本地域名服务器将失去的IP地址返回给操作系统,同时本人也将IP地址缓存起来
- 操作系统将 IP 地址返回给浏览器,同时本人也将IP地址缓存起来
- 浏览器失去域名对应的IP地址
浏览器中输出URL返回页面过程?
- 解析域名,找到主机 IP。
- 浏览器利用 IP 间接与网站主机通信,三次握手,建设 TCP 连贯。浏览器会以一个随机端口向服务端的 web 程序 80 端口发动 TCP 的连贯。
- 建设 TCP 连贯后,浏览器向主机发动一个HTTP申请。
- 参数从客户端传递到服务器端。
- 服务器端失去客户端参数之后,进行相应的业务解决,再将后果封装成 HTTP 包,返回给客户端。
- 服务器端和客户端的交互实现,断开 TCP 连贯(4 次挥手)。
- 浏览器解析响应内容,进行渲染,出现给用户。
DNS 域名解析的过程
在网络中定位是依附 IP 进行身份定位的,所以 URL 拜访的第一步便是先要失去服务器端的 IP 地址。而失去服务器的 IP 地址须要应用 DNS(Domain Name System,域名零碎)域名解析,DNS 域名解析就是通过 URL 找到与之绝对应的 IP 地址。
DNS 域名解析的大抵流程如下:
- 先检查浏览器中的 DNS 缓存,如果浏览器中有对应的记录会间接应用,并实现解析;
- 如果浏览器没有缓存,那就去查问操作系统的缓存,如果查问到记录就能够间接返回 IP 地址,实现解析;
- 如果操作系统没有 DNS 缓存,就会去查看本地 host 文件,Windows 操作系统下,host 文件个别位于 "C:\Windows\System32\drivers\etc\hosts",如果 host 文件有记录则间接应用;
- 如果本地 host 文件没有相应的记录,会申请本地 DNS 服务器,本地 DNS 服务器个别是由本地网络服务商如挪动、联通等提供。通常状况下可通过 DHCP 主动调配,当然也能够本人手动配置。目前用的比拟多的是谷歌提供的专用 DNS 是 8.8.8.8 和国内的专用 DNS 是 114.114.114.114。
- 如果本地 DNS 服务器没有相应的记录,就会去根域名服务器查问了。为了能更高效实现寰球所有域名的解析申请,根域名服务器自身并不会间接去解析域名,而是会把不同的解析申请调配给上面的其余服务器去实现。
图片来源于网络
什么是cookie和session?
因为HTTP协定是无状态的协定,须要用某种机制来识具体的用户身份,用来跟踪用户的整个会话。罕用的会话跟踪技术是cookie与session。
cookie就是由服务器发给客户端的非凡信息,而这些信息以文本文件的形式寄存在客户端,而后客户端每次向服务器发送申请的时候都会带上这些非凡的信息。说得更具体一些:当用户应用浏览器拜访一个反对cookie的网站的时候,用户会提供包含用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是寄存在HTTP响应体中的,而是寄存于HTTP响应头;当客户端浏览器接管到来自服务器的响应之后,浏览器会将这些信息寄存在一个对立的地位。 自此,客户端再向服务器发送申请的时候,都会把相应的cookie寄存在HTTP申请头再次发回至服务器。服务器在接管到来自客户端浏览器的申请之后,就可能通过剖析寄存于申请头的cookie失去客户端特有的信息,从而动静生成与该客户端绝对应的内容。网站的登录界面中“请记住我”这样的选项,就是通过cookie实现的。
cookie工作流程:
- servlet创立cookie,保留大量数据,发送给浏览器。
- 浏览器取得服务器发送的cookie数据,将主动的保留到浏览器端。
- 下次访问时,浏览器将主动携带cookie数据发送给服务器。
session原理:首先浏览器申请服务器拜访web站点时,服务器首先会查看这个客户端申请是否曾经蕴含了一个session标识、称为SESSIONID,如果曾经蕴含了一个sessionid则阐明以前曾经为此客户端创立过session,服务器就依照sessionid把这个session检索进去应用,如果客户端申请不蕴含session id,则服务器为此客户端创立一个session,并且生成一个与此session相关联的举世无双的sessionid寄存到cookie中,这个sessionid将在本次响应中返回到客户端保留,这样在交互的过程中,浏览器端每次申请时,都会带着这个sessionid,服务器依据这个sessionid就能够找失去对应的session。以此来达到共享数据的目标。 这里须要留神的是,session不会随着浏览器的敞开而死亡,而是期待超时工夫。
cookie和session的区别?
- 作用范畴不同,Cookie 保留在客户端,Session 保留在服务器端。
- 有效期不同,Cookie 可设置为长时间放弃,比方咱们常常应用的默认登录性能,Session 个别生效工夫较短,客户端敞开或者 Session 超时都会生效。
- 隐衷策略不同,Cookie 存储在客户端,容易被窃取;Session 存储在服务端,安全性绝对 Cookie 要好一些。
- 存储大小不同, 单个 Cookie 保留的数据不能超过 4K;对于 Session 来说存储没有下限,但出于对服务器的性能思考,Session 内不要寄存过多的数据,并且须要设置 Session 删除机制。
什么是对称加密和非对称加密?
对称加密:通信单方应用雷同的密钥进行加密。特点是加密速度快,然而毛病是密钥泄露会导致密文数据被破解。常见的对称加密有AES
和DES
算法。
非对称加密:它须要生成两个密钥,公钥和私钥。公钥是公开的,任何人都能够取得,而私钥是私人保存的。公钥负责加密,私钥负责解密;或者私钥负责加密,公钥负责解密。这种加密算法安全性更高,然而计算量相比对称加密大很多,加密和解密都很慢。常见的非对称算法有RSA
和DSA
。
说说 WebSocket与socket的区别
Socket是一套规范,它实现了对TCP/IP的高度封装,屏蔽网络细节,以不便开发者更好地进行网络编程。Socket其实就是等于IP地址 + 端口 + 协定。
WebSocket是一个长久化的协定,它是随同H5而出的协定,用来解决http不反对长久化连贯的问题。
Socket一个是网编编程的标准接口,而WebSocket则是应用层通信协议。
ARP协定的工作过程?
ARP解决了同一个局域网上的主机和路由器IP和MAC地址的解析。
- 每台主机都会在本人的ARP缓冲区中建设一个ARP列表,以示意IP地址和MAC地址的对应关系。
- 当源主机须要将一个数据包要发送到目标主机时,会首先查看本人 ARP列表中是否存在该 IP地址对应的MAC地址,如果有,就间接将数据包发送到这个MAC地址;如果没有,就向本地网段发动一个ARP申请的播送包,查问此目标主机对应的MAC地址。此ARP申请数据包里包含源主机的IP地址、硬件地址、以及目标主机的IP地址。
- 网络中所有的主机收到这个ARP申请后,会查看数据包中的目标IP是否和本人的IP地址统一。如果不雷同就疏忽此数据包;如果雷同,该主机首先将发送端的MAC地址和IP地址增加到本人的ARP列表中,如果ARP表中曾经存在该IP的信息,则将其笼罩,而后给源主机发送一个 ARP响应数据包,通知对方本人是它须要查找的MAC地址。
- 源主机收到这个ARP响应数据包后,将失去的目标主机的IP地址和MAC地址增加到本人的ARP列表中,并利用此信息开始数据的传输。
- 如果源主机始终没有收到ARP响应数据包,示意ARP查问失败。
ICMP协定的性能
ICMP,Internet Control Message Protocol ,Internet管制音讯协定。
- ICMP协定是一种面向无连贯的协定,用于传输出错报告管制信息。
- 它是一个十分重要的协定,它对于网络安全具备极其重要的意义。它属于网络层协定,次要用于在主机与路由器之间传递管制信息,包含报告谬误、替换受限管制和状态信息等。
- 当遇到IP数据无法访问指标、IP路由器无奈按以后的传输速率转发数据包等状况时,会主动发送ICMP音讯。
比方咱们日常应用得比拟多的ping,就是基于ICMP的。
什么是DoS、DDoS、DRDoS攻打?
- DOS: (Denial of Service),翻译过去就是拒绝服务,所有能引起DOS行为的攻打都被称为DOS攻打。最常见的DoS攻打就有计算机网络宽带攻打、连通性攻打。
- DDoS: (Distributed Denial of Service),翻译过去是分布式拒绝服务。是指处于不同地位的多个攻击者同时向一个或几个指标动员攻打,或者一个攻击者管制了位于不同地位的多台机器并利用这些机器对受害者同时施行攻打。常见的DDos有SYN Flood、Ping of Death、ACK Flood、UDP Flood等。
- DRDoS: (Distributed Reflection Denial of Service),中文是分布式反射拒绝服务,该形式靠的是发送大量带有被害者IP地址的数据包给攻打主机,而后攻打主机对IP地址源做出大量回应,从而造成拒绝服务攻打。
什么是CSRF攻打,如何防止
CSRF,跨站申请伪造(英文全称是Cross-site request forgery),是一种挟制用户在以后已登录的Web应用程序上执行非本意的操作的攻打办法。
怎么解决CSRF攻打呢?
- 查看Referer字段。
- 增加校验token。
什么是XSS攻打?
XSS,跨站脚本攻打(Cross-Site Scripting)。它指的是歹意攻击者往Web页面里插入歹意html代码,当用户浏览该页之时,嵌入其中Web外面的html代码会被执行,从而达到歹意攻打用户的非凡目标。XSS攻打个别分三种类型:存储型 、反射型 、DOM型XSS
如何解决XSS攻打问题?
- 对输出进行过滤,过滤标签等,只容许非法值。
- HTML本义
- 对于链接跳转,如
<a href="xxx"
等,要校验内容,禁止以script结尾的非法链接。 - 限度输出长度
防盗链
盗链是指服务提供商本人不提供服务的内容,通过技术手段(能够了解成爬虫)去获取其余网站的资源展现在本人的网站上。常见的盗链有以下几种:图片盗链、音频盗链、视频盗链等。
网站盗链会大量耗费被盗链网站的带宽,而真正的点击率兴许会很小,重大侵害了被盗链网站的利益。
被盗网站就天然会防盗链,能够通过常常更换图片名,也能够通过检测referer。因为失常用户拜访一张图片肯定是从本人的网站点击链接进去的,如果一个申请的referer是其余网站,就阐明这是一个爬虫。
什么是 Referer?
这里的 Referer 指的是 HTTP 头部的一个字段,也称为 HTTP 起源地址(HTTP Referer),用来示意从哪儿链接到目前的网页,采纳的格局是 URL。换句话说,借着 HTTP Referer 头部网页能够查看访客从哪里而来,这也常被用来凑合伪造的跨网站申请。
盗链网站会针对性进行反盗链,能够通过在申请的headers中设置referer来绕过防盗链,咱们当初应用爬虫抓取他人的网站也是这样。
什么是空 Referer,什么时候会呈现空 Referer?
首先,咱们对空 Referer 的定义为,Referer 头部的内容为空,或者,一个 HTTP 申请中基本不蕴含 Referer 头部。
那么什么时候 HTTP 申请会不蕴含 Referer 字段呢?依据 Referer 的定义,它的作用是批示一个申请是从哪里链接过去,那么当一个申请并不是由链接触发产生的,那么天然也就不须要指定这个申请的链接起源。
比方,间接在浏览器的地址栏中输出一个资源的 URL 地址,那么这种申请是不会蕴含 Referer 字段的,因为这是一个 “凭空产生” 的 HTTP 申请,并不是从一个中央链接过来的。
说下ping的原理
ping,Packet Internet Groper,是一种因特网包摸索器,用于测试网络连接量的程序。Ping是工作在TCP/IP网络体系结构中应用层的一个服务命令, 次要是向特定的目标主机发送ICMP(Internet Control Message Protocol 因特网报文控制协议) 申请报文,测试目标站是否可达及理解其无关状态。
一般来说,ping能够用来检测网络通不通。它是基于ICMP
协定工作的。假如机器A ping机器B,工作过程如下:
- ping告诉零碎,新建一个固定格局的ICMP申请数据包
- ICMP协定,将该数据包和指标机器B的IP地址打包,一起转交给IP协定层
- IP层协定将本机IP地址为源地址,机器B的IP地址为指标地址,加上一些其余的管制信息,构建一个IP数据包
- 先获取指标机器B的MAC地址。
- 数据链路层构建一个数据帧,目标地址是IP层传过来的MAC地址,源地址是本机的MAC地址
- 机器B收到后,比照指标地址,和本人本机的MAC地址是否统一,合乎就解决返回,不合乎就抛弃。
- 依据目标主机返回的ICMP回送答复报文中的工夫戳,从而计算出往返工夫
- 最终显示后果有这几项:发送到目标主机的IP地址、发送 & 收到 & 失落的分组数、往返工夫的最小、最大& 平均值
最初给大家分享一个Github仓库,下面有大彬整顿的300多本经典的计算机书籍PDF,包含C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,能够star一下,下次找书间接在下面搜寻,仓库继续更新中~
Github地址:https://github.com/Tyson0314/...