面经 计算机网络

网络基础

OSI模型

表格

概念层数据单位作用设备
物理层比特提供光纤标准、传送数据的通路,传输比特流网线等等
数据链路层数据帧帧定界和帧同步;顺序控制,指对帧的收发顺序的控制;差错检测和恢复;APR、RARP协议交互机、网桥
网络层数据分组或数据包两个主机系统之间提供连接和路径选择路由器
传输层报文段定义传输协议和端口;分段传输,到达目的地址后重组-
会话层-管理应用程序间的通信-
表示层-把应用层提供的信息变换为能够共同理解的形式、保证各系统、应用可以读取-
应用层-应用层协议,如HTTP协议-

总结

  • 下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;
  • 第4层(传输成TCP/UDP)作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
  • 简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

TCP/IP四层模型

TCP/IP 又叫网际协议群,可以说是OSI模型的实现,强调在计算机上实现协议应该开发哪种程序

概念层TCP/IP 协议群
应用层FTP、HTTP、Telnt
数据链路层TCP、UDP
网络层IP、ICMP、RIP、OSFF,ICMP,BGF
网络接口层/链路层ISO、IEEE标准

TCP三次握手&四次挥手

报文格式

TCP Tags

  • URF 紧急指针标志
  • ACK 确认序号标志
  • PSH push标志
  • RST 重置连接标志
  • SYN 同步需要,用于建立连接过程
  • FIN 完成标志,用于释放连接

三次握手

具体过程

一般由客户端发起连接请求

  • 第一次握手(SYN=1, seq=x)

    客户端发送一个 TCP 的 SYN 标志位置1的包。  
    发送完毕后,客户端进入 `SYN_SEND` 状态。
  • 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)

    服务器发回确认包(ACK)应答。SYN 标志位和 ACK 标志位均为1。  
    发送完毕后,服务器端进入 `SYN_RCVD` 状态。
  • 第三次握手(ACK=1,seq=x+1,ack=y+1)

    客户端再次发送确认包(ACK)。SYN 标志位为0,ACK 标志位为1  
    发送完毕后,客户端进入 `ESTABLISHED` 状态,当服务器端接收到这个包时,也进入 `ESTABLISHED` 状态,TCP 握手结束。
    

为什么需要三次握手才能建立起连接

  • 为了初始化seq number,作为以后数据传输的序号,保证数据传输过程中数据不会乱序

首次握手隐患-SYN超时

  • Server收到Client的SYN,回复SYN-ACK的时候未收到ACK
  • Server不断重试直至超时
  • 攻击者可以把SYN的队列耗尽,使正常请求无法处理
  • SYN Flood防护措施

    • SYN队列满后,通过tcp_syncookies参数回发SYn Cookie
    • 若为正常连接则Cliet会回发SYNCookie,直接建立连接

建立连接后,Client出现故障

  • 向对方发送保活探测报文,如果未收到响应则继续发送,直到保活探测数

四次挥手

具体过程

  • 第一次挥手(FIN=1,seq=u)

    Client发送一个FIN包,迎来关闭Client到Server的数据传送。  
    发送完毕后,客户端进入 `FIN_WAIT_1` 状态。
  • 第二次挥手(ACK=1,seq=v,ack=u+1)

    Server收到FIN包,发送一个ACK到Client,确认序号为收到序号+1。  
    发送完毕后,服务器端进入 `CLOSE_WAIT` 状态。  
    客户端接收到这个确认包之后,进入 `FIN_WAIT_2` 状态,等待服务器端关闭连接。
  • 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1)

    Server发送一个FIN包,用来关闭Server到Client的数据传送。  
    发送完毕后,服务器端进入 `LAST_ACK` 状态,等待来自客户端的最后一个ACK。
  • 第四次挥手(ACK=1,seq=u+1,ack=w+1)

    Client收到FIN包后,Client进入 `TIME_WAIT`状态,接着发送一个ACK包给Server,确认序号为收到序号+1。  
    服务器端接收到这个确认包之后,关闭连接,进入 `CLOSED` 状态。
  • 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。在等待过程中,可以使本连接持续的时间内所产生的所有报文段从网络中消失。这样就可以使下一个新的连接中不会出现旧的连接请求报文段。

为什么需要四次握手才能断开连接

  • 因为全双工,发送发和接收方都需要FIN报文和ACK报文

服务器出现大量CLOSE_WAIT状态的原因

  • 对方关闭socket连接,我方忙于读与写,没有及时关闭连接
  • 检查代码,特别是释放资源的代码
  • 检查配置,特别是处理请求的线程配置

TCP和UDP区别

UDP简介

  • 面向非连接
  • 不维护连接状态,支持同时向多个客户端传输相同的消息
  • 数据包报头只有8哥字节,额外开销小
  • 吞吐量之受限于数据生成速率、传输速率以及机器性能
  • 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表
  • 面向报文,不对应用程序提交的信息进行拆分或者合并

TCP和UDP的区别

  • 面向连接VS无连接(适用于多端发布)
  • 可靠性
  • 有序性
  • 速度
  • 量级

TCP的滑动窗口

TCP使用滑动窗口做流量控制与乱序重排

  • 保证TCP的可靠性
  • 保证TCP的流控特性

RTT和RTO

  • RTT 发送一个数据包到收到对应的ACK,所花费的时间
  • RTO 发送时间间隔(根据RTT计算)

HTTP与HTTPS

http特点

  • 支持客户/服务器模式
  • 简单快速
  • 灵活
  • 无连接(即使http1.1的keep-live机制,属于http之外的,始终认为请求结束后关闭连接,下层实现对上层透明)
  • 无状态

http响应步骤

  • 客户端连接到Web服务器
  • 发送http请求
  • 服务器接收请求并返回HTTP响应
  • 释放连接TCP连接
  • 客户端浏览器解析HTML内容

在浏览器地址栏键入URL回车流程

  • DNS解析
  • TCP连接
  • 发送HTTP请求
  • 服务器处理请求并返回HTTP报文
  • 浏览器解析渲染页面
  • 连接结束

常见HTTP状态码

  • 1XX 指示信息:表示请求已接受,继续处理
  • 2XX 成功:表示请求已被成功接收、理解、接受
  • 3XX 重定向:要完成请求必须进行更进一步的操作
  • 4XX 客户端错误:请求用语法错误或请求无法实现
  • 5XX 服务器端错误:服务器未能实现合法的请求

GET和POST请求的区别

  • HTTP报文层面:GET请求信息放在URL,POST放在报文体中
  • 数据库层面:GET符合幂等性和安全性,POST不符合
  • 其他层面:GET可以被缓存、被存储,而POST不行

Cookue和Session的区别

  • Cookie数据存放在客户的浏览器上、Seession数据放在服务器上
  • Session相对于Cookie更安全
  • 若考虑减轻服务器开销,应当考虑Cookie

HTTP和HTTPS的区别

SSL(TLS) 安全套接层

  • HTTPS需要到CA申请证书,HTTP不需要
  • HTTPS密文传输,HTTP明文传输
  • 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
  • HTTPS=HTTP+加密+认证+完整性保护,较安全

HTTPS并不绝对安全

  • 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
  • 可以使用HSTS优化
# 面经
: )