《面试那些事儿》之TCP+HTTP详解

  最近懒癌加拖延症又上来了,好久没更文章,今天继续开更。最近主要更新一些关于面试知识。

  TCP

    TCP协议与HTTP协议两者是密不可分的。其中TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。但是,http是基于tcp协议的。       

  TCP与HTTP分层协议模型 

  • 物理层将二进制的0和1和电压高低,光的闪灭和电波的强弱信号进行转换

  • 链路层代表驱动

  • 网络层

  • 使用 IP 协议,IP 协议基于 IP 转发分包数据

  • IP 协议是个不可靠协议,不会重发

  • IP 协议发送失败会使用ICMP 协议通知失败

  • ARP 解析 IP 中的 MAC 地址,MAC 地址由网卡出厂提供

  • IP 还隐含链路层的功能,不管双方底层的链路层是啥,都能通信

  • 传输层

  • 通用的 TCP 和 UDP 协议

    • TCP 协议面向有连接,能正确处理丢包,传输顺序错乱的问题,但是为了建立与断开连接,需要至少7次的发包收包,资源浪费
    • UDP 面向无连接,不管对方有没有收到,如果要得到通知,需要通过应用层
  • 会话层以上分层

  • TCP/IP 分层中,会话层,表示层,应用层集中在一起

  • 网络管理通过 SNMP 协议

   

  TCP三次握手和四次挥手?

  这个问题可以说是最常见的面试题,但还是记不住。。。

  三次握手:

    • 客户端–发送带有SYN标志的数据包–一次握手–服务端
    • 服务端–发送带有SYN/ACK标志的数据包–二次握手–客户端
    • 客户端–发送带有带有ACK标志的数据包–三次握手–服务端

  四次挥手:

    • 客户端-发送一个FIN,用来关闭客户端到服务器的数据传送
    • 服务器-收到这个FIN,它发回一个ACK,确认序号为收到的序号加1 。和SYN一样,一个FIN将占用一个序号
    • 服务器-关闭与客户端的连接,发送一个FIN给客户端
    • 客户端-发回ACK报文确认,并将确认序号设置为收到序号加1

  那么这三次握手是怎样进行的呢? 

    发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;

    接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;  最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。之后,一个TCP连接建立,开始通讯。

  HTTP

    HTTP协议:超文本传输协议(HyperText Transfer Protocol)

    Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求  需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。

    所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并  且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

  传输流
    http的传输流

        (图片来自网络,侵删)

  其中发送端在层与层之间传输时都会加上本层的首部,在接收端每经过一层都会移除本层的首部。
  
  状态码
    常用的就那么几个,见的多了就记住了。

     2XX 成功

      • 200 OK,表示从客户端发来的请求在服务器端被正确处理
      • 204 No content,表示请求成功,但响应报文不含实体的主体部分
      • 206 Partial Content,进行范围请求

    3XX 重定向

      • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
      • 302 found,临时性重定向,表示资源临时被分配了新的 URL
      • 303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
      • 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
      • 307 temporary redirect,临时重定向,和302含义相同

    4XX 客户端错误

      • 400 bad request,请求报文存在语法错误
      • 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
      • 403 forbidden,表示对请求资源的访问被服务器拒绝
      • 404 not found,表示在服务器上没有找到请求的资源

    5XX 服务器错误

      • 500 internal sever error,表示服务器端在执行请求时发生了错误
      • 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
 

   HTTP的无状态性

    所谓HTTP协议的无状态性是指服务器的协议层无需为不同的请求之间建立任何相关关系,它特指的是协议层的无状态性。但是这并不代表建立在HTTP协议之上的应用程序就无法维持状态。应用层可以通过会话Session来跟踪用户请求之间的相关性,服务器会为每个会话对象绑定一个唯一的会话ID,浏览器可以将会话ID记录在本地缓存LocalStorage或者Cookie,在后续的请求都带上这个会话ID,服务器就可以为每个请求找到相应的会话状态。

     输入url到页面加载都发生了什么事情?(最常问的来了)

    • 输入地址
    • 浏览器查找域名的 IP 地址这一步包括 DNS 具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存…
    • 浏览器向 web 服务器发送一个 HTTP 请求
    • 服务器的永久重定向响应(从 http://example.com 到 http://www.example.com)
    • 浏览器跟踪重定向地址
    • 服务器处理请求
    • 服务器返回一个 HTTP 响应
    • 浏览器显示 HTML
    • 浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)
    • 浏览器发送异步请求
  TCP协议中的常见的标志及其含义  
    SYN:同步标志

      同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
    ACK:确认标志
      确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
    RST:复位标志
      复位标志有效。用于复位相应的TCP连接。
    URG:紧急标志
      紧急(The urgent pointer) 标志有效。紧急标志置位,
    PSH:推标志
      该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
    FIN:结束标志
      带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据
      三次握手Three-way Handshake

   部分内容来自芋道源码,在这里表示感谢。

猜你喜欢

转载自www.cnblogs.com/juihai/p/9108195.html