一些基础概念。

网络模型

  • 应用层 Application Layer
  • Protocol:HTTP
  • 传输层 Transport Layer
  • Protocol:TCP/ UDP
  • 网络层 Internet Layer
  • Protocol:IP

输入url发生什么

  1. url 解析 parsing
    解析并生成HTTP消息
  2. 发送之前找ip
    本地浏览器缓存 -> 本地host ->本地DNS解析器缓存 -> 本地DNSserver
    ->( - 主域名server,返回
    - 顶级域名server,返回
    - 根域名server,返回 )
    -> 返回本地DNSserver ->返回client
  3. 获取ip后,把 HTTP 的传输工作交给操作系统中的协议栈
    include:TCP/ UDP + IP
    • TCP:三次握手+ 传输报文
      TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。
      生成IP报文 + MAC包头
  4. 通过网卡,路由器传给server
    server逐层去掉头部拿出content,处理数据。返回响应
    响应添加头部传给client
  5. client去掉头部,渲染网页
    解析html css 构建dom,渲染tree,绘制节点
  6. TCP4次挥手断开连接

TCP vs UDP

  • 连接:
    TCP传数据之前要连接,UDP不需要连直接传
  • 服务对象:
    TCP 一对一,UDP支持一对一,一对多,多对多
  • 可靠性:
    TCP:可靠。不丢不错按顺序
    UDP:可能丢
  • 拥塞控制、流量控制
    TCP有,保证安全
    UDP没有,即使网络很堵,也不影响UDP发送速率
  • 首部开销
    TCP首部长开销大,还可能变长
    UDP首部只有8字节,且固定
  • 传输方式
    TCP 流式传输,没有边界,保证顺序可靠
    UDP 一个包一个包发送,有边界,可能丢包或乱序
  • 分片
    如果过大TCP在传输层分片,UDP在IP层分片
  • 应用场景:
    TCP:用于 FTP,HTTP/HTTPS
    UDP: 视频音频广播

三次握手 四次挥手

字段

  • seq:(sequence number)序号
  • ack:(acknowledgement number)确认号
  • 标志位:
    • SYN: (SYNchronization) 同步
    • ACK: (ACKnowlegment) 确认
    • FIN: (FINish) 终止

三次握手

  1. client: SYN=1,seq=x
    如果丢失,会重传
  2. sever: SYN=1,seq=y, ACK=1,ack=x+1
    如果丢失,1和2都会重传
  3. client: eq=x+1, ACK=1, ack=y+1
    如果丢失,2会重传
    第三次握手可以携带数据,前两次握手不可以携带数据

为什么要三次:

  • 可以防止旧的重复连接初始化造成混乱
  • 可以同步双方的初始序列号
  • 可以避免资源浪费

因为别人给你发了第一条,就表示你可以发数据了,这时可能是旧消息,它来了你就直接发数据这不好吧。

四次挥手

  1. c: FIN=1,seq=u
  2. s: seq=v, ACK=1,ack=u+1
  3. s: FIN=1,seq=w, ACK=1,ack=u+1
  4. c: seq=u+1, ACK=1,ack=w+1

为什么要四次:

哪一端发fin,表示它不再发送,但它还可以接受。那如果它收到fin,要处理一下自己最后要发送的发送出去。

TIME_WAIT

等待时间是2MSL 相当于至少允许报文丢失一次。

收到fin就会重置计时器。

主动发起的一方才会有。

为什么需要它?

  • 防止历史连接中的数据,被后面重新开始的连接错误的接收
    这个时长可以让两个方向的数据包都被丢弃
  • 保证「被动关闭连接」的一方,能被正确的关闭
    如果直接关了,④发的ack又丢了,③就要重传,这时④已经关了,就会异常终止。