浏览器原理学习记录 二

85 阅读4分钟

TCP 协议

三层基础网络模型

  • A 主机
  1. 上层 数据包

  2. 网络层 数据包+ip 头(目标 ip,发送源 ip,生存时间等)

    | | 物理底层 ===> 网线 |

  • B 主机
  1. 网络层 解析 ip 头,拿到数据包
  2. 上层 拿到数据包

udp

ip 只负责把数据发到对应的电脑,但是电脑不知道需要一个基于 ip 的在 ip 协议之上的协议,用来和应用打交道的协议 udp 就是这样一种协议 udp:用户数据包协议 upd 协议多了一个端口号,通过端口号,把对应的数据交给对应端口的

四层基础网络模型 UDP 版本

  • A 主机
  1. 应用层 数据包

  2. 传输层 数据包+udp 头(目标端口+源端口等)

  3. 网络层 数据包+ip 头(目标 ip,发送源 ip,生存时间等)

  4. | | 物理底层 ===> 网线 |

  • B 主机
  1. 网络层 解析 ip 头,拿到数据包+udp 头
  2. 传输层 解析数据,拿到 udp 头,指定端口号
  3. 应用层 拿到数据包

最全 7 层网络模型 (不是 http 的)

  1. 应用层
  2. 表示层
  3. 会话层
  4. 传输层
  5. 网络层
  6. 数据链路层
  7. 物理层

udp 协议优缺点

优点:udp 协议传输速度快 缺点:

  1. 容易丢包
  2. 因为分割成多个小包,所以无法组件一个完整的数据包,数据正确性有问题
  • 所以 udp 只适合一些不太在意数据正确性,注重传输速度的地方,比如视频,互动游戏

tcp

基于上诉原因,引入了 tcp 协议 tcp:传输控制协议 优点:

  1. 提供了排序的功能
  2. 支持重发
  • 缺点:速度没那么快

四层基础网络模型 TCP 版本

  • A 主机
  1. 应用层 数据包

  2. 传输层 数据包+tcp 头(目标端口+源端口等)

  3. 网络层 数据包+ip 头(目标 ip,发送源 ip,生存时间等)

  4. | | 物理底层 ===> 网线 |

  • B 主机
  1. 网络层 解析 ip 头,拿到数据包+tcp 头
  2. 传输层 解析数据,拿到 tcp 头,指定端口号
  3. 应用层 拿到数据包

tcp 三次握手 四次挥手

  • 握手:
  1. 客户端发送:我要发送信息了:搜到请回答 SYN=1 seq = k state = syn_send
  2. 服务端:收到请求,我这边一些正常,可以发送,收到请回复 ACK = 1 ack = k+1 SYN = 1 seq = j state = syn_rcvd
  3. 客户端:收到回复,准备好,要开始发送了 ACK = 1 ack = j+1 state = established
  4. 服务端:(动作进入连接状态)state = established
  • 传输信息----- 传输过程中,服务的收到数据后都会发送一个确认消息
  1. 发送消息 seq = u
  2. 回复收到消息 ACK = 1 ack = u+1
  • 挥手:
  1. 客户端(或服务端):数据发送完毕,我要关闭了 FIN =1 seq = k state = close_wait_1

  2. 服务端:收到关闭请求 ACK = 1 ack = k+1 state = close_wait

  3. 客户端:收到 state = close_wait_2

  4. 服务端:数据发完了,我完事儿了,我也关闭了 FIN = 1 ACK =1 ack = k+1 seq = w state = last_ack

  5. 客户端:收到 ACK=1 ack = w+1 seq = k+1 state = time_wait

  6. 服务都: state = closed

  7. 客户端: 2 MSL 后 state = closed

问题 1 为什么握手是三次 挥手却要四次 因为建立连接时,服务端可以立刻开始建立链接,也就是进入同步状态,但是关闭连接时,服务端不一定能够立刻开始进入关闭,所以需要等服务端处理完任务

问题 2 客户端为什么要等两个最大报文生存时间才关闭 这是为了保证服务端一定能接受到最后一个 ACK,如果最后一个 ACK 丢失了,服务端会不断重复发送 FIN =1,让客户端一直发最后一个 ACK 两个最大报文生存时间,就是这一个发送一个回复所需的最大时间,如果超过,客户端都没有在收到 FIN,就可推动 ACK 已经被接受,可以接受 TCP 链接

问题 3 为什么是三次握手而不是两次握手 如果客户端发送的建立信息卡住了,等很久才发给服务端,这时候服务端收到后,建立链接,但是客户端不会发新消息,这样就建立了一个空链接 如果服务端发送的建立消息卡住了,就会,导致客户端不知道服务端是否建立链接,也不会管服务端发到消息,服务端会一直发送信息,导致死锁 问题 4 如果客户端出故障怎么办 服务端存在保活定时器,最大两小时,两小时没收到,会发生十次探测报文,如果没反应,服务器就会自动关闭