struct

base:

1.计算机网络

2.数据库

3.操作系统

special:

1.算法

2.项目

other:

1.软技能

2.沟通

3.逆商


一.计算机网络

1.五层协议:物理层、数据链路层、网络层、传输层、应用层

物理层:传输单位为比特(电气信道01001....),实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异, 使数据链路层不必考虑网络的具体传输介质是什么;规定了网络中的电气特性,负责传送0和1电气信号,协议有ieee;设备:中继器(Repeater,也叫放大器)和集线器;

数据链路层:基本传输单位为,物理寻址,同时将原始比特流转化为逻辑传输线路;两个相邻节点之间传送数据时,数据链路层将网络层传下来的IP数据报组转成帧(framing),在连个相邻节点透明的传送帧(frame)中的数据。每帧中包含必要的控制信息(如同步信息、地址信息、差错控制等),协议:以太网协议;设备:网桥和交换机;

网络层:择合适的网间路由和交换结点, 确保数据及时传送;路由选择,逻辑编址,分组传输;协议:ip、igmp、icmp、ospf;负责分组交换网上的不同主机提供服务;路径选择、路由及逻辑寻址; 基本数据单位为IP数据报;设备:路由器;

传输层:tcp、udp;负责两个主机进程之间的通信提供服务;计算机有许多需要网络的的程序,比如QQ、浏览器等,通过端口(PORT)进行区分,它其实是每一个使用网卡的程序的编号,每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据;“传输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做”套接字”(socket)。有了它,就可以进行网络应用程序开发了。设备:网关

应用层:直接为用户提供进程服务,规定应用程序的数据格式;定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则,不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等;基本单位为报文;

2.三次握手和四次挥手

三次握手:struct第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认;

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态;

第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了;

为什么TCP链接需要三次握手,两次不可以么,为什么?

        为了防止 已失效的链接请求报文突然又传送到了服务端,因而产生错误;

  当客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到链接释放以后的某个时间才到达Server,Server误以为这是Client发出的一个新的链接请求,于是就向客户端发送确认数据包,同意建立链接。若不采用“三次握手”,那么只要Server发出确认数据包,新的链接就建立了。由于client此时并未发出建立链接的请求,所以其不会理睬Server的确认,也不与Server通信;而这时Server一直在等待Client的请求,这样Server就白白浪费了一定的资源;

四次挥手:

struct图片来源:面试官,不要再问我三次握手和四次挥手 - 知乎

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

挥手为什么需要四次?

        三次握手中当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手;

四次挥手释放连接时,等待2MSL的意义?

  • 保证客户端发送的最后一个ACK报文段能够到达服务端。这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。
  1. 一个MSL确保最后一个ACK能到达对端

  2. 一个MSL确保对端没收到ACK而重传的FIN能到达

  • 防止“已失效的连接请求报文段”出现在本连接中。客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。

3.tcp、udp区别

  1. TCP 是面向连接的,udp非面向连接;

  2. tcp面向字节流,没有固定报文边界,发送方可以一次发10条,接受方可以分十次接受;udp面向报文,有固定的报文大小;

  3. tcp是可靠的:数据校验和、序列号(按序到达)、超时重传、确认机制、流量控制、拥塞控制;

  4. tcp传输速度慢,udp快;

  5. tcp单播一对一,udp可以多播,多对多;

tcp协议:http(超文本传输协议)、ftp(文件传输协议)、telnet(远程登录)、smtp(发邮件)、pop3(接邮件)等;

udp协议:dns(域名系统)、snmp(简单网络管理协议,管理网络设备)、tftp(简单文本传输协议)等;

流量控制-tcp滑动窗口:发送方和接收方两个窗口,根据缓存区剩余空间动态调整发送数据大小,达到流量控制的效果,基于发送端和接受端而言;

接收端报告窗口大小的报文丢失,会产生死锁;由于发送方会等这个报文,而接受端认为已经发送成功,会等发送端的请求报文,此时循环等待,死锁;解决方法加定时器,发零窗口探测报文;

拥塞处理-慢启动、拥塞避免、快重传、快回复:针对整个网络流量而言;发送方维持一个拥塞窗口,拥塞窗口与滑动窗口都是控制发送端速率, 滑动窗口保证接收端能力, 拥塞窗口保证网络能力;

慢启动:通常把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值,收到一个ack,cwnd+1,达到rtt,加倍;

为防止拥塞窗口cwnd增长过大引起网络拥塞,需要设置一个慢开始门限ssthresh,超过门限用拥塞避免算法,否则用慢启动算法;

拥塞避免:每经过一个往返时间RTT把发送方的拥塞窗口cwnd加1,而不是加倍;

快重传:TCP收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,进行快重传;

快恢复:发送端收到三次重复ACK时, 进入快速恢复, 即网络轻度拥塞. 拥塞阈值降为拥塞窗口的一半, 拥塞窗口设置为拥塞阈值+3;

4、Http和Https的区别

  Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP;

端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;

资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;

开销:Https通信需要证书,而证书一般需要向认证机构购买;

状态:HTTP 无状态,无连接,通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作;
无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。

计算机网络常见面试题 - 追逐更好的自己 - 博客园

5.https流程、对称加密与非对称加密

1.客户端想服务器发起HTTPS的请求,连接到服务器的443端口;

2.服务器将非对称加密的公钥传递给客户端,以证书的形式回传到客户端

3.服务器接受到该公钥进行验证,就是验证2中证书,如果有问题,则HTTPS请求无法继续;如果没有问题,则上述公钥是合格的。(第一次HTTP请求)客户端这个时候随机生成一个私钥,成为client key,客户端私钥,用于对称加密数据的。使用前面的公钥对client key进行非对称加密;

4.进行二次HTTP请求,将加密之后的client key传递给服务器;

5.服务器使用私钥进行解密,得到client key,使用client key对数据进行对称加密

6.将对称加密的数据传递给客户端,客户端使用非对称解密,得到服务器发送的数据,完成第二次HTTP请求。

struct

 HTTPS请求的整个过程的详细分析_研究生生活、学习记录-CSDN博客_https过程

对称加密:加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。

算法:DES,AES,3DES等

非对称加密:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。

算法:RSA,ECC

6、输入网址的过程

  1. 输入网址
  2. DNS解析获取域名对应的IP地址
  3. 建立TCP连接
  4. web浏览器向web服务器发送HTTP请求
  5. 服务器的永久重定向响应
  6. web服务器做出应答
  7. 浏览器显示 HTML
  8. web服务器关闭TCP连接

从输入一个网址到浏览器显示页面经历的全过程笔记 - 简书

7.DNS寻址,递归、迭代;

1.看缓存,有缓存就直接用缓存里的ip访问;

2.如果缓存中没有,则去查询hosts文件;

3.如果hosts文件里没有,查本地dns服务器(移动、联通等)

4.本地dns服务器没有记录,去找根服务器。根服务器全球只要13台,去找其中之一;找了根服务器后,根服务器会根据请求的域名,返回对应的“*域名服务器”,不直接返回结果;之后进行迭代返回二级、三级域名服务器,知道找到,最后结果会返回本地dns服务器;

5.本地dns服务器再把结果返回到本机;

第四步是迭代查询,其余是本机到本地dns服务器查询的过程,为递归;

8.http1.0/1.1和2.0区别

详解HTTP/1.0、HTTP/1.1、HTTP/2、HTTPS_李浩东的博客-CSDN博客

http1.0与http1.1:

缓存处理:HTTP/1.1 加入更多的缓存控制策略:Cache-Control、Etag/If-None-Match等;

错误状态管理:HTTP/1.1新增了24个错误状态响应码;

范围请求:HTTP/1.1在请求头引入了range头域,允许只请求资源的某个部分,返回码是206,方便*的选择以便于充分利用带宽和连接,支持断点续传;

Host头:HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误。有了Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础;

持久连接:HTTP/1.1 最大的变化就是引入了持久连接(persistent connection),在HTTP/1.1中默认开启 Connection: keep-alive,即TCP连接默认不关闭,可以被多个请求复用;

管道机制:HTTP/1.1中引入了管道机制(pipelining),即在同一个TCP连接中,客户端可以同时发送多个请求;

http1.1问题:虽然可以多个请求复用一个tcp连接,但先后次序固定,如果先请求的时间过长,后边请求要等,队头阻塞;

Http2.0:解决了http1.1的性能问题,特点:

二进制分帧:HTTP/1.1的头信息是文本(ASCII编码),数据体可以是文本,也可以是二进制;HTTP/2 头信息和数据体都是二进制,统称为“帧”:头信息帧和数据帧;

多路复用(双工通信):通过单一的 HTTP/2 连接发起多重的请求-响应消息,即在一个连接里,客户端和浏览器都可以同时发送多个请求和响应,而不用按照顺序一一对应,这样避免了“队头堵塞”。HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。

请求优先级(数据流):因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。HTTP/1.1取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。

首部压缩:HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息压缩后再发送(SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法)。;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

服务端推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。

上一篇:html网页音乐播放器自带播放列表


下一篇:Node.js入门:前后端模块的异同