zoukankan      html  css  js  c++  java
  • 面试准备——(二)专业知识(3)网络

    面试遇到的问题:

    美团:

    1. 网络七层体系结构

    滴滴:

    1.网络体系结构(七层、五层、TCP/Ip),各层的作用和协议。

    2.TCP/IP在哪一层

    3. TCP/UDP区别和应用场景

    4. TCP如何保证它的可靠性

    5. TCP如何面向连接?三次握手、四次释放过程?为什么是三次握手不是两次或者四次?

    6. HTTP是哪一层?有哪几种操作?

    7. GET和POST区别,其中,GET请求可以提交吗?(URL中包含用户名和密码,那它可以提交吗)?

    8. 有配置过服务器吗?你们用的是什么类型的服务器?

    9. 一个请求访问首页的URL,到达服务器后具体的操作?如何调用本地的方法的?

    一、 TCP/IP协议族

    TCP/IP模型由四层结构组成:网络接口层、网际层、传输层、应用层,每层分别具有不同的协议和功能。TCP/IP协议族是一组在不同层的多个协议的组合,各层在实现自身功能时,为上层提供服务。

     1.封装

    在源主机,通过TCP/UDP传送用户数据时,将用户数据送入TCP/IP协议栈,然后自上而下通过每一层,最后被当作一串比特流传入网络。 其中每一层对收到的数据都需要增加一些首部信息,有时还需要增加尾部信息。这些操作过程称为封装

    2. 拆封

    二、五层模型

    **1. 在浏览器中输入 www.baidu.com 后执行的全部过程

    1. 应用层上使用了HTTP协议

    1)首先客户端通过DNS解析域名请求(UDP协议),得到URL对应的IP地址。DNS解析过程

    1. 浏览器缓存。(2~30min)
    2. 系统缓存(windows:gethostbyname)
    3. 路由器缓存
    4. ISP DNS缓存
    5. 递归搜索:从根域名服务器开始递归搜索。其中,为了消除例如微博这种多个IP对应一个域名的问题,使用
      • 循环DNS,是DNS查找时返回多个IP时的解决方案
      • 负载平衡器,以一个特定的IP地址进行侦听,并将网络请求转发到集群服务器上的硬件设备。
      • 地理DNS,根据用户所在地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。
      • Anycast, 是一个IP地址映射多个物理主机的路由技术。与TCP协议适应性不是很好,但是大多数DNS服务器使用Any cast来获得高效低延迟的DNS

    2)浏览器客户端发起一个HTTP请求到这个IP地址(HTTP协议是以ASCII传输)

    2. 在传输层使用了TCP协议建立连接,通过流量控制、拥塞控制、差错控制保证数据传输的稳定性。

    • 把HTTP请求分成报文段,添加源和目的端口,封装成TCP协议报
      • 例如服务器端使用80端口监听客户端请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回客户端的5000端口。
    • 输入网络层

    3. 网络层:使用IP、ICMP、ARP、RARP协议

    1)首先,进行寻址和路由。使用路由表确定到达服务器的路径以及ARP协议将IP地址转化成服务器MAC地址。ARP解析过程广播发送ARP请求,单播发送ARP响应

    1. 首先,每个主机在自己的ARP缓存区,建立一个ARP列表,包含IP和MAC的对应关系
    2. 当源主机要发送数据时,首先检查ARP列表中是否有对应IP和MAC地址,如果不存在,则广播发送ARP请求,包含了:自己的IP、MAC和目的IP地址
    3. 在广播域中的主机,接受到ARP数据包后,首先检查是否是自己的IP地址,如果不是,则忽略;如果是,则单播给源主机自己的MAC地址

    它是IPv4网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代

    2)同时使用ICMP协议,对数据报进行差错控制

    3)然后对IP数据报进行拆分和重装,添加IP信息,传入数据链路层。

    4. 数据链路层:

    将IP数据报加上控制信息:校验码/验证码+帧定界符,封装成数据帧,传入物理层

    5. 物理层:

    将数据帧转换成0,1比特流。最后,使用真正的电信号通过多种传输介质传输到百度的服务器。

    当电信号到达服务器,对数据帧进行拆分,直到应用层。

    服务器:

    对于Tomcat,有一个Context容器,也就是Servlet容器。

    1. 当Servlet启动时,它会部署加载所有的Web应用,

    1. 每个应用都创建一个Servlet Context(Servlet上下文),保存在内存中。Servlet Context对象就是已知路径的根,定义了一组方法的API:http://localhost:8080/项目名
    2. 处理Web应用的web.xml文件,一次性创建在web.xml中定义的servlet、Filter、Listener,同样保存在内存中

    2. 当Servlet容器关闭时,它会卸载所有的web应用和ServletContext,所有的Servlet、Filter、Listener都会被销毁

    3. 每个Servlet都有:init()、service()、destroy()函数。

    1. init():在启动调用时用于初始化参数
    2. service():完成服务
    3. destroy():容器销毁时,调用

    4. 那么Servlet容器接受HTTP请求的过程

    当客户端发送一个HTTP请求时,Servlet容器会创建一个新的HTTPServletRequest对象HTTPServletResponse对象

    1. HttpServletRequest对象把客户的请求信息封装起来,然后调用servlet的service(request, respones),然后转向doGet()或doPost(),完成Servlet的执行
    2. 接着把Servlet的执行返回到HTTPServletResponse对象中
    3. 最后Servlet容器把客户的请求发送给客户,完成客户一次服务过程。

     一、传输层

    **1. TCP 三次握手/四次释放

    TCP协议是传输层的协议,特点是:面向连接、通信可靠

    面向连接:在传送TCP报文之前,必须先建立TCP连接,数据传输完成后要进行链路释放

    1. 三次握手的步骤:

    第一次握手:客户端通过向服务器发送一个SYN报文段(SYN=1, ACK =0)来请求创建连接,并且生成一个随机序列号seq=x。

    第二次握手:服务器端收到用户SYN报文后,为该TCP连接分配一个缓存和变量,并生成一个允许建立连接的报文:SYN=1,ACK=1,同时设置ack确认码为x+1(即告诉客户端,希望下次收到的序列号从x+1开始),此时,该SYN/ACK序列号seq = y。

    第三次握手:客户端收到服务器端的报文后,也要为该连接分配缓存和变量。同时发送一个ACK报文段(SYN=0,ACK=1)表示确认,此时,ack=y+1(表示下次希望收到的序列号从y+1开始),seq=x+1(表示此次数据序列号从x+1开始)。当服务器端收到这个报文以后,就完成了建立。

    2. 为什么需要第三次握手?

    第三次握手的目的是为了防止已失效的客户机请求建立报文段突然又传送到了服务器,因而产生错误。

    例如:当客户端发送一次连接请求SYN报文段,因为网络原因,在一定时间内没有收到允许连接的报文。所以客户端会重传这个报文段。客户端发出了两个请求建立报文,服务器响应了第二个报文段,并且建立了连接,完成了数据传输,关闭连连。在这个时候,如果服务器收到了第一个请求建立报文,就会允许建立连接,等待传送资源。

    如果没有第三次握手,服务器会认为客户端在传输资源过程中而白白等待——浪费资源

    有了第三次握手以后,服务器在一定时间内,没有收到客户端的第三次确认ACK报文段,会自动释放资源。

    3. 四次释放

    无论是客户端还是服务器端都可以提出终止连接的请求,连接释放后,两端的资源(缓存和变量)都会释放,分为四步:

    第一步:通讯中任意一方(例如客户端)提出连接释放请求报文,FIN=1,此时进入“释放等待-1”状态。序列号seq=客户端发送的最后一个序列号+1(u),ack=v(确认收到服务器v-1以前的字节)

    第二步:服务器收到“连接释放请求报文”以后,发送“连接释放请求确认报文”,ack=u+1, seq=v,ACK=1,允许该方向TCP连接的释放。至此,从客户端到服务器端这个方向的TCP连接就释放了,但是服务器端到客户端的连接还没释放,称为“半关闭状态”:客户端进入“FIN-WAIT-2”状态,服务器进入“CLOSER_WAIT”状态

    第三步:服务器的高层应用已经没有数据需要发送时,服务器端发送“连接释放请求报文”给客户端。此时FIN=1,ACK=1,seq=w,ack=u+1,数据部分不携带数据。服务器端经过“LAST-ACk”状态进入“LISTEN”状态。

    第四步:客户端向服务器端回复一个确认该方向连接释放的报文段,其中ACK=1,seq=u+1,ack=w+1。等待一个固定时间,真正关闭TCP连接。

    4. 为什么要等待一个固定时间?(为什么是四次释放,第四次释放丢失怎么办?)

    当B在第三步发送了“连接释放请求”报文段后,A发送“确认连接释放请求”,并等待一个固定时间,有两个主要原因:

    1. 为了保证A最后的确认报文段能够到达B。即这个报文段可能会丢失,那么B会重传让A在一次确认。如果没有等待时间,A在发出了确认报文段后立即释放资源,那么B无法重传(连接已经释放,任何数据不能传了),则无法获得确认进入CLOSED状态。

    2. 防止已失效的连接请求报文段出现在连接中。经过这个固定时间,滞留在网络中的任何报文段都可以发送到目的地,不会滞留在网络中,这样的话,下一次的连接中就不会出现上一个连接遗留的报文段了。

    5.  TCP怎么进行流量控制的?

    流量控制的目的控制发送端发送速率,使之不超过接受端的接受速率

    实现机制:面向字节的滑动窗口——接受端根据接受能力选择一个合适的接受窗口值,将它写在发送给通信对方的TCP报头,将接受的状态通知给发送方,发送方的发送窗口不能超过接受窗口。

    (1)当接收端的应用进程从缓存中读取字节的速度>=发送方的发送速度时,接受端在每一个确认中发送一个非零的窗口通知

    (2)当接受端的处理速度<发送方的发送速度时,接受端在每一个确认中发送一个零窗口通知,此时接受端停止发送,直到下一次接收到一个非零窗口通知。

    6. TCP怎么进行拥塞控制

    1)为什么无法使用流量控制?

    流量控制是控制端到端的流量,无法控制进入网络的总体流量,拥塞控制的重点是进入网络报文总量的全局控制上,是在整个网络的输入负载超过了网络能够承受的程度。

    2)解决方法:让每一个发送方根据感知的网络拥塞情况来限制其向网络发送的速率。如果一个发送方感知到从它到目的主机的网络畅通,则增加发送的速率;反之若感知到网络的拥塞,则降低发送速率。

    7. TCP如何进行差错控制?

    有三个工具:

    1. 校验和:检测受到损伤的报文段

    2. 确认:确认已经收到的报文段。

    1. 累计确认:确认已经正确接收到的数据流中最大序列号
    2. 选择确认SACK:用来报告时许的数据快和重复的数据快。并不是代替ACK,而是向发送端发送特定的信息。例如:我们已经收到了0-1000, 2000-3000,中间未收到1001~19999,这个时候SACK就会发送未接受的数据字节流的两个边界(10001,1999)。

    3. 超时。

    • 当发送端发送数据时,会启动一个计时器
    • 当接收端收到发送端发送的数据时,需要回复一个确认
    • 如果在计时器到点之前,没有收到接收端的确认,则发送法重传数据

    自适应的超时重传机制

    TCP监视每一连接中的当前延迟,并适配重发定时器来适应通信条件的变化。

    8. 快速重传为什么是三次冗余ack,这个三次是怎么定下来的?

    包的丢失有三种情况:1)校验和错误(时序);2)网络拥塞;3)网络断开

    对于收到两次相同ack可能是乱序,接收到三次以上的相同ack表明网络拥塞。

    8. TCP的差错控制

    8. TCP和UDP区别和应用

      TCP UDP

    本质

    面向连接的、可靠的数据流传递
    • 三次握手、四次释放
    • 差错控制、拥塞控制、流量控制
    非面向连接的不可靠的
    传输单位 TCP报文段   用户数据报
    特点 注重数据安全性 数据传输快,不需要连接等待
    对应的应用层协议

    FTP:文件传输协议:21
    Telnet:远程登录端口,23
    SMTP:邮件传输协议,25
    POP3:与SMTP对应,用于接受邮件。110
    HTTP协议:80

    文件、邮件传输

    DNS:域名解析服务,53
    SNMP:简单网络管理协议,用于管理网络设备,161
    TFTP:简单文件传输协议,69

    视频

     6.  什么是Socket

    Socket本质是API编程接口封装了TCP/IP,在应用层用来实现不同主机间进程的通信。具体而言,我们用IP地址+协议号+端口号来标记一个进程,然后利用socket来进行通信。

    socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

     Socket通信机制:

    服务器:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。具体过程:

    服务器:

    1)socket():服务器首先根据地址类型(IPV4/IPV6)、socket类型及协议初始化socket。

    2)bind():为socket绑定IP地址和端口号

    3)listen():监听端口号请求,随时准备接受客户端发来的连接,这时服务器的socket并没有打开。

    客户端:

    4)socket:客户端创建socket()

    5)connect():根据服务器的Ip地址和端口号试图连接服务器socket

    服务器:

    6)服务器socket接收到客户端socket的请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket处于阻塞状态。(TCP的三次连接)

    客户端:

    7)客户端连接成功,向服务器发送连接状态信息。

    服务器端:

    8)服务器端accept()方法返回,连接成功

    客户端:

    9)客户端向socket写入信息

    服务器

    10)服务器读取信息

    客户端

    11)客户端关闭

    服务器端

    12)服务器端关闭

    二、网络层

    三、应用层

    1. HTTP和HTTPS

    1)HTTP状态码

    1xx: 信息性状态码

        100, 101

    2xx: 成功状态码

        200:OK

    3xx: 重定向状态码

        301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向;

        302: 临时重定向,显式重定向, Location响应首部的值为新的URL

        304:Not Modified  未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,

                            告诉浏览器,你不用请求该资源,直接使用本地的资源即可。

    4xx: 客户端错误状态码

        403: Forbidden 404: Not Found  请求的URL资源并不存在

    5xx: 服务器端错误状态码

        500: Internal Server Error  服务器内部错误

        502: Bad Gateway  前面代理服务器联系不到后端的服务器时出现

        504:Gateway Timeout  这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应

    2)HTTPS:安全套接字层超文本传输协议

     

    安全性

    端口

    HTTP

    明文方式发送内容,不提供任何方式的数据加密

    80

    HTTPS

    +SSL协议

    握手:客户端产生一个对称密钥,服务器端通过证书来交换密钥

    443

    2. HTTP1.0和HTTP1.1

      连续性 流水线 Host请求头字段 请求头和响应头
    HTTP1.0

    非持续连接:

    每一个应答响应对应一个TCP连接

    非流水线:

    客户端在接收到前一个应答才会发送下一个请求

    不支持  
    HTTP1.1 多个客户与服务器的请求/应答报文可以通过一个TCP连接来完成 流水线:客户端可以连续的发送请求,服务器端可以连续的发送应答

    支持:Web浏览器可以使用主机头名来表明将要访问服务器的哪个Web站点,

    实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点

    还提供了:与身份认证、状态管理、Cache缓存等机制相关的请求头和响应头

    3. Cookie和Session

    引入的原因:HTTP协议是无状态的协议,而用户的所有请求操作应该属于同一会话

      Cookie Session
    存储位置 客户端 服务器端

    目的

    跟踪会话,也可以保存用户偏好设置或者用户密码 跟踪会话
    安全性 不安全 安全

    session技术是要使用到cookie的,之所以出现session技术,主要是为了安全

    4. HTTP协议包含哪些请求

    GET:获取URL下的资源、提交表单信息(用户名、密码)

    POST:向服务器提交更新数据(创建或更新服务器资源)

    PUT:存储一个资源到请求的URL

    DELETE:删除给定的URL所标志的资源

    HEAD:返回URL标志的头信息

    TRACE:返回TRACE请求附带的头字段

    OPTION:返回服务器支持的HTTP请求

    5. Post和Get

      GET POST
    作用 从给定的URL下请求资源,或提交表单信息

    向指定的资源提交要处理的数据

    (更新或新建资源)

    幂等性 具有幂等性,不产生副作用(后退、刷新没有变化) 不具备幂等性(重新提交表格)
    做书签  可做书签   不可做书签
    缓存 能被缓存 不能被缓存
    对数据类型的限制 ASCII字符   无限制,可以为二进制

    其中,最重要的两个差别就是:作用和幂等性。

    另外:网络上还有一些理解是不正确的:

    1. GET用URL或者Cookie传递参数,POST同BODY传参:

    现代的WebServer都是支持GET中包含BODY这样请求。GET和POST与数据传递没有关系

    2. GET的URL会有长度限制,而POST数据可以很大

    HTTP协议对GET和POST没有长度限制,URL上的限制主要从服务器的安全性、稳定性的考虑。

    3. GET信息在URL中传递,不安全

    6. 幂等(Idempotence)

    HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。(注意是副作用)

    1)GET http://www.bank.com/account/123456:获取这个URI下面的资源,不会改变资源的状态。

    注意:这里强调的是“副作用”,虽然可能每次返回的GET结果可能不同。

    ——GET具有幂等性

    2)DELETE http://www.forum.com/article/4231:删除资源,有副作用,但DELETE应该满足幂等性

    调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。

    3)POST http://www.forum.com/articles:POST所对应的URI并非创建的资源本身,而是资源的接收者

    这句话语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性

    4)PUT http://www.forum/articles/4231PUT所对应的URI是要创建或更新的资源本身。

    这句话语义是:建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性

     

    7. 网站用户密码保存

    使用明文保存——>明文Hash后保存(如:md5)——>MD5+SALT方式(SALT:系统随机产生一些值)

    8. RESTful架构

    RESTful框架,是一种互联网软件架构,它满足REST原则,结构清晰、符合标准、易于理解、扩展方便。

    REST原则:

    1)每一个资源对应一个URI

    2)客户端和服务器之间,传递这个资源的某种表示层

    3)客户端通过四个HTTP动词,对服务器资源进行操作,实现“表示层转化”

    (详细而言:)

    1. 资源Resources

    网络中每一个实体、资源——>URI(统一资源对应符)

    2. 表示层(Representation)

    我们把"资源"具体呈现出来的形式,叫做它的"表现层。例如:HTML格式、XML格式、JSON格式

    3. 状态转化(State Transfer)

    访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

    HTTP有四个操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

    总结而言:

     进化的顺序: RPC -> SOAP -> RESTful

    9. WebService

      

    10. CSRF和XSS

    CSRF(Cross-site request forgery)跨站请求伪造

    XSS(Cross the Scripting)跨站脚本攻击

    11. Ajax

    AJAX:Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

    是与在不重新加载整个页面的情况下与服务器交换数据并更新部分网页的技术。

    12. forward & sendRedirect 比较

      转向forward 重定向redirect
    本质

    客户端发送http请求,服务器接受这个请求,调用内部的一个方法在容器内完成该请求和转发动作

    将目标资源发送给客户端。

    1. 客户端发送http请求,服务器端接受次请求,回复301响应码和新的URL地址给客户端

    2. 客户端发现是302请求,自动再发出一个http请求,请求URL是新的地址

    服务器根据这个新的URL寻找资源发送给客户端。

    请求次数  一次http请求

    至少两次http请求:

    地址栏显示  不变,转发路径必须是同一个web容器下的URL 新的URL,地址可以是任意的
    数据共享 转发页面和转发到的页面可以共享request里面的数据. 不可以共享
    作用  一般作用于用户登录时,根据角色转发到相应的模块  一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
    效率

    其中两个动作的工作流程:

    1. 转发过程(forward)

    客户浏览器发送Http请求——>web服务器接受该请求——>调用内部的一个方法在容器内完成请求处理和转发动作——>将目标资源发送给客户

    上面直接转发请求的过程:

    1)浏览器向Servlet1发出请求

    2)Servlet1调用forward()方法,在服务器端将请求转发给Servlet2

    3)最终由Servlet2做出相应

    举例:A向B借钱,B没有钱,向C借钱,借没有借到钱都会将消息回复给A

    • 在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,
    • 中间传递的是自己的容器内的request。
    • 在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。 

    2. 重定向过程(sendRedirect)

    客户浏览器发送Http请求——>web服务器接受此请求后,发送302响应码以及新的location给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的Http请求,请求url是新的location地址——>服务器根据此请求寻找资源发送给客户。

    具体而言:

    1)浏览器向Servlet1发出访问请求

    2)Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2

    3)浏览器向Servlet2发出请求

    4)最终由Servlet2做出相应

    举例:它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。

    A向B借钱,B没有钱让A向C借钱。

    • 在这里 location可以重定向到任意URL
    • 既然是浏览器重新发出了请求,则就没有什么request传递的概念了。
    • 在客户浏览器路径栏显示的是其重定向的 路径,客户可以观察到地址的变化的。
    • 重定向行为是浏览器做了至少两次的访问请求的。 

    四、数据链路层:

  • 相关阅读:
    向量求导几则公式备忘
    电脑硬件接触不良
    caffe编译新问题
    faster-rcnn 目标检测 数据集制作
    py-faster-rcnn 的makefile.config 注意事项
    ubuntu14.04 python + opencv 傻瓜式安装解决方案
    轻量级神经网络平台tiny-dnn实践
    OpenMP 并行编程
    React在Render中使用bind可能导致的问题
    为了cider,尝试emacs的坑
  • 原文地址:https://www.cnblogs.com/lesleysbw/p/6422509.html
Copyright © 2011-2022 走看看