题目

  1. TCP的模型,状态转移
  2. HTTP和HTTPS的区别,HTTPS有什么特点,带来的好处和坏处,怎么实现的?答案
  3. TCP 讲了一遍,讲 Segment 中的每个字段是如何为 TCP 面向连接、可靠的流式服务提供支持的
  4. TCP怎么保证可靠性,以及画一下建立连接和断开连接的过程,发了什么?答案
  5. 讲讲TCP为什么是三次握手,四次挥手?答案
  6. 讲讲浏览器输入地址后发生的全过程.(每一个细节都讲)答案
  7. http请求报文和应答报文的格式(三块)
  8. http返回码。答案
  9. ip地址有什么用,ip地址和mac地址。答案
  10. OSI七层模型和TCP/IP四层模型,每层列举2个协议。答案
  11. DNS
  12. 拥塞控制。答案
  13. UDP模拟TCP
  14. 客户端向服务器发3个包,基于TCP和UDP的服务器会收到几个?
  15. 介绍time_wait状态
  16. TCP/IP 数据链路层的交互过程,传递到IP层怎么知道报文该给哪个应用程序,再问:它怎么区分UDP报文还是TCP报文?答案
  17. 滑动窗口
  18. TCP传输对包的大小有限制吗?
  19. 现在我要传输一个1M的数据包,tcp如何传输?
  20. HTTP1.0与HTTP2.0
  21. TCP和UDP各自的优势,知道哪些使用UDP协议的成功案例。答案
  22. TCP和UDP各用了底层什么协议
  23. 单个UDP报文最大容量
  24. TCP粘包怎么处理
  25. 如果网络延迟很高,但是又没有发生丢包,利用tcp会使吞吐量下降,该如何解决呢
  26. socket编程中服务端和客户端分别用到哪些函数?答案

参考答案

    • HTTP和HTTPS的区别:
      • HTTP是以明文的方式在网络中进行传输数据,而HTTPS协议传输的数据则是经过TLS加密过的,因而具有更高的安全性;
      • HTTPS在经过TCP的三次握手后,还要进行SSL的handshake,协商加密使用的对称加密密钥;
      • HTTPS需要服务器端申请证书,且浏览器端安装对应的根证书;
      • HTTP的端口是80,而HTTPS的端口是443。
    • HTTPS的优点:
      • 在数据传输过程中使用密钥进行加密,所以安全性更高;
      • 通过认证用户和服务器,因而可以确保数据发送到正确的用户和服务器。
    • HTTPS的缺点:
      • 握手阶段延时较高:由于在进行HTTPS会话之前,还需要进行SSL握手,因此HTTPS握手阶段延时增加;
      • 部署成本高:一方面需要使用证书来验证自身的安全性,需要购买CA证书;另一方面,由于采用HTTPS协议需要加解密计算,占用CPU资源较多,需要的服务器配置或数目较高。
        返回原题
    • 序列号、确认应答、超时重传:
      • 数据到达接收方,接收方需要发回一个确认应答,表示已经收到该数据段。并且确认序号会说明它下次要接收的数据序列号。如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方会在等待大约2倍RTT(报文往返时间)后进行重传。
    • 窗口控制与快重传:
      • TCP会利用窗口控制来提高传输速度,即在一个窗口大小内,不用一定得等到确认应答后才能发送下一个数据,窗口大小就是无需等待确认而可以继续发送数据段的最大值。
      • 使用窗口控制,如果某数据段丢失,则接收方会持续发送该数据段的序列号的应答,如果发送方连续收到三次该应答,则立刻进行重发。
    • 拥塞控制:
      • 为了防止发送数据过多,造成网络拥塞。
      • 慢开始、拥塞避免、快重传等
        返回原题
    • 三次握手:
      • 过程:C–>SYN–>S;S–>SYN/ACK–>C;C–>ACK–>S。
      • 原因:可以防止已经失效的连接请求报文突然又传递到服务器端造成服务器资源浪费的情况发生。以及确保连接的可靠性。
      • 例子:客户端发出了一个连接请求的SYN,但由于网络阻塞,该报文滞留在某节点了。然后超过一定时长后,客户端又重新发出了一个SYN,并与服务器建立连接、传输数据,最后再关闭连接。这时,滞留在某节点的SYN突然又传递到了服务器端,如果只有二次握手,服务器端会误以为这是客户端新建立的连接请求,于是发送一个SYN给客户端,并在服务器创建socket套接字,一直等待客户端传送数据。但由于客户端没有连接服务器的需求,会直接丢弃SYN,此时服务器会一直等待客户端发送数据,而造成资源浪费。
    • 四次挥手:
      • 过程:C–>FIN–>S;S–>ACK–>C;S–>FIN–>C;C–>ACK–>S。
      • 原因:关闭连接时,仅代表关闭方没有数据要发送给另一方了,并不代表另一方没有数据要发送给关闭方,所以此时不能关闭socket套接字,需要等所有数据发送完之后才能发送FIN给关闭方。
        返回原题
    1. 将URL解析为IP地址,解析域名需要用到DNS协议;
      • 主机依次通过查询本地hosts文件、DNS解析器缓存、本地的DNS服务器、根域名服务器。
      • 根域名服务器查询分为两种,一种是递归查询,一种是迭代查询。
      • 如果是递归查询,此根域名服务器不断向上转发请求,直至得到最终结果,并将解析结果返回给本地DNS服务器,本地DNS服务器再将其返回给浏览器,查询完成;
      • 如果是迭代查询,本地服务器向根域名服务器发送查询请求。根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求。然后以此类推,直至查询到该域名的IP地址。
      • 是基于UDP的,因此会用到UDP协议;
    2. 得到IP地址后,浏览器打开TCP连接(默认端口为80),并向Web服务器发送http请求,因此要用到HTTP协议;
      • 应用层:浏览器发送HTTP请求报文;
      • 传输层:切分长数据,并确保可靠性;
      • 网络层:进行路由
      • 数据链路层:传输数据
      • 物理层:物理传输比特
    3. 若页面发生跳转,服务器以一个重定向响应,然后转到第iv步,否则转到第v步;
    4. 浏览器跟随重定向,再次发送HTTP请求;
    5. 服务器处理请求,并发回HTML源码;
      • 服务器经过物理层、数据链路层、网络层、传输层、应用层解析请求报文,并返回HTML源码
    6. 浏览器接受请求的页面源码,并开始渲染HTML;
    7. 浏览器发送嵌入到HTML中的对象请求;
    8. 浏览器进一步发送异步(Ajax)请求;
    9. 浏览器关闭TCP连接。
      返回原题
    • HTTP的状态码由三位数字组成,第一个十进制数定义了状态码的类型:

      分类 分类描述
      1** 信息,服务器收到请求,需要请求者继续执行操作
      2** 成功,操作被成功接收并处理
      3** 重定向,需要进一步的操作以完成请求
      4** 客户端错误,请求包含语法错误或无法完成请求
      5** 服务端错误,服务器在处理请求的过程中发生了错误
    • 常见的HTTP状态码:

      • 200:请求成功
      • 301:资源(网页等)被永久地转移到其它URL
      • 404:请求的资源(网页等)不存在
      • 500:内部服务器错误
        返回原题
    • IP地址:IP协议提供的一种统一的地址格式,为互联网的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异;
    • MAC地址:硬件地址,用于定义网络设备的位置,由数据链路层负责。
      返回原题
    • OSI七层模型:
      • 物理层:通过媒介传输比特,确定机械和电气规范。主要设备有网卡、中继器等;主要协议有IEE802.3、CLOCK、RJ45等。
      • 数据链路层:将比特组装成帧和点到点的传输。主要设备有网桥、交换机等;主要协议有MAC、VLAN、PPP协议等。
      • 网络层:负责数据包从源到宿的传递以及网际互联。主要设备有路由器等;主要协议有IP、ARP、TCMP。
      • 传输层:提供端到端的可靠报文传递和错误恢复。主要协议有TCP、UDP等。
      • 会话层:建立、管理和终止会话,传输单位是SPDU(Session Protocol Data Unit)。主要协议有RPC、NFS等。
      • 表示层:对数据进行翻译、加密和压缩,传输单位是PPDU(Presentation ~)。主要协议有JPEG、ASCII等。
      • 应用层:允许访问OSI环境的手段,传输单位为APDU(Application ~)。主要协议有HTTP、FTP、DNS等。
    • TCP/IP四层模型:
      • 网络接口层:MAC、VLAN
      • 网络层:IP、ICMP
      • 传输层:TCP、IP
      • 应用层:HTTP、DNS、FTP
        返回原题
    • 拥塞控制是为了防止过多的数据注入网络,使得网络中的路由器或链路过载。流量控制是点对点的通信量控制,而拥塞控制是全局的网络流量整体性的控制。发送双方都有一个拥塞窗口——cwnd(Congestion Window);
    • cwnd的大小取决于网络的拥塞程度,并且动态地在变化。
    • 发送方让自己发送窗口大小等于拥塞窗口,但考虑到接收方的接收能力,一般而言发送窗口小于拥塞窗口;
    • 几种算法:
      • 慢开始:最开始发送方的拥塞窗口为1,逐渐增大拥塞窗口和发送窗口。每经过一个传输轮次,拥塞窗口加倍,如果其超过慢开始的门限,则使用拥塞避免算法,防止拥塞窗口过大;
      • 拥塞避免:每经过一次往返时间RTT,拥塞窗口增长1。在慢开始和拥塞避免中,如果发现网络拥塞,就把慢开始中的门限值减小到之前的一半,并设置cwnd为1,重新慢开始;
      • 快重传:接收方接收到一个失序的报文段后就立即发出重复确认,发送方只要连续收到三个重复确认就立即重传;
      • 快恢复:当发送方连续收到了三个重复确认后(说明当前网络没有拥塞),就将慢开始门限减半,并将当前的cwnd设置为慢开始门限,并且采用拥塞避免算法。
    • 什么时候开始减慢增长速度:
      • 采用慢开始和拥塞避免算法的时候:
        • 一旦cwnd超过慢开始门限,就采用拥塞避免算法,减慢增长速度;
        • 一旦发生丢包,就重新进行慢开始,减慢增长速度。
      • 采用快恢复和快重传的时候:
        • 一旦cwnd超过慢开始门限,就采用拥塞避免算法,减慢增长速度;
        • 一旦发送方连续收到了三个重复确认,就采用拥塞避免算法,减慢增长速度。
          返回原题
    • TCP/IP数据链路层的交互过程:
      • 网络层等到数据链路层用MAC地址作为通信目标,数据包到达网络等准备往数据链路层发的时候,首先会去自己的ARP缓存表(存储着IP-MAC关系)中查找目标IP的MAC地址,如果查到了,就将该MAC地址组装到链路层数据包的包头;如果没找到,会发起一个广播:who is IP XXX tell IP XXX,所有收到的广播的机器看看这个IP是否是自己的,如果是自己的,则以单拨的形式将自己的MAC地址回复给请求的机器。
    • 传递到IP层如何知道该给哪个应用程序:
      • 根据端口号区分。
    • 如何区分是UDP报文还是TCP报文:
      • 看IP数据段的协议标识字段,6是TCP,17是UDP。
        返回原题
    • 二者区别:
      • 连接:TCP是面向连接的传输层协议,而UDP无连接;
      • 服务对象:TCP是端到端的两端间服务,即一条TCP连接只能有两个端点;而UDP支持一对一、一对多、多对一、多对多的通信;
      • 可靠性:TCP是可靠交付,无差错、不丢失、不重复、按序到达;而UDP尽最大努力交付,不保证可靠交付;
      • 拥塞控制、流量控制:TCP有拥塞控制和流量控制,保证传输数据的安全性;而UDP没有这些,网络拥塞不会影响源主机的发送效率;
      • 报文长度:TCP是动态报文长度,即根据接收方的窗口大小以及网络拥塞状态来决定的;而EDP面向报文,不合并、不拆分,保留上面传下来报文的边界;
      • 首部开销:TCP首部开销大,占20个字节;而UDP首部开销小,只有8个字节(源端口、目的端口、数据长度、检验和)
    • 各自适用场景:
      • UDP:视频传输、实时通信等;
      • TCP:文件传输、发送邮件、重要状态的更新等。
        返回原题
    • 基于TCP的socket:

      • 服务器端程序:
        1. 创建一个套接字,用函数socket();
        2. 绑定IP地址、端口号到套接字,用函数bind();
        3. 设置允许最大的连接数,用函数listen();
        4. 接收客户端的连接,用函数accept();
        5. 收发数据,用函数send()和recv(),或read()或write();
        6. 关闭网络连接,用close()。
      • 客户端程序:
        1. 创建一个套接字,用函数socket();
        2. 设置要连接的对方的IP和端口属性;
        3. 连接服务器,用函数connect();
        4. 收发数据,用函数send()和recv(),或read()和write();
        5. 关闭网络连接,用close()。
    • 基于UDP的socket:

      • 服务器端程序:

        1. 建立套接字文件描述符,使用函数socket(),创建一个套接字文件描述符;
        2. 设置服务器地址和监听端口,初始化要绑定的网络地址结构;
        3. 绑定监听端口,使用bind()函数,将套接字文件描述符和一个地址类型变量进行绑定;
        4. 接收客户端的数据,使用recvfrom();
        5. 向客户端发送数据,使用sendto();
        6. 关闭套接字,使用close释放资源;
      • 客户端程序:

        1. 建立套接字文件描述符,socket();
        2. 设置服务器端口和地址,struct sockaddr;
        3. 向服务器发送数据,sendto();
        4. 接收服务器的数据,recvfrom();
        5. 关闭套接字,close()。
          返回原题