加载中...
avatar
文章
42
标签
25
分类
21
首页
Java
Spring全家桶
  • Spring
  • SpringBoot
  • SpringCloud
JVM
源码
  • Mybatis
  • HashMap
归档
其他
  • 互联网电子书汇总
  • JAVA八股文指南
  • 历史
  • 相册
关于
Logo码农Stormling网络系列(一)| TCP 快速入门
搜索
首页
Java
Spring全家桶
  • Spring
  • SpringBoot
  • SpringCloud
JVM
源码
  • Mybatis
  • HashMap
归档
其他
  • 互联网电子书汇总
  • JAVA八股文指南
  • 历史
  • 相册
关于

网络系列(一)| TCP 快速入门

发表于2021-12-05|更新于2025-01-07|网络
|总字数:961|阅读时长:3分钟|浏览量:

简介

互联网有一整套协议构成,TCP是其中的一层

以太网

  • 作用:电子信号如何组成数据包(packet),解决了子网内部点对点通信
  • 缺点:无法连接多个局域网,IP协议解决

IP

  • 作用:定义一套自己的地址规则,通过路由的形式将各个局域网相连。路由器基于IP协议
  • 路由器内部有一张路由表,规定 IP 出口,实现数据包转发
  • 缺点:是地址协议,不能保证数据完整,TCP 协议解决

TCP

  • 作用: 保证数据通信的完整性和可靠性,防止丢包

TCP 数据包

以太网的数据包 大小固定,最初1518 增加到 1522 字节 。其中头信息(head)22 字节,负载(payload):1500字节

数据包

以太网数据包:1522 字节

  • 头信息:22
  • 负载:1500
    • IP数据包
      • 头信息:20(最少)
      • 负载:1480
        • TCP 数据包
          • 头信息:20 (最少)
          • 负载:1400

数据包

TCP 数据包编号(SEQ)

TCP 为每个数据包编号(sequence number),目的是为了接收方按照顺序还原。另外,万一丢包也可知道丢失哪一个包。

每个数据包都有两个编号

  • 自身编号:sequence number
  • 下一个包编号:next sequence number

如下图表示:当前包的负载大小为 46183-45943 = 240 字节

编号 SEQ

TCP 数据包组装

操作系统持续接收 TCP 数据包,按照顺序组装好。一旦组装完成后,根据数据包中的端口(port)参数,交给监听该端口的应用程序处理。应用程序收到组装好的原始数据,会根据 HTTP 协议中的 Content-Length 字段开始一段段读取数据。其中应用程序需要的数据放在 TCP 数据包中, TCP 原始文件的大小由应用层的协议来规定。

监听端口

慢启动和ACK

原因:服务器可能由于带宽小、路由器过热、缓存溢出等情况,导致丢包,因此服务器发包的速度不是越快越好。

作用:服务器为了达到线路的最高速率,获知对方线路的理想速率,使用慢启动。

Linux 内核设计一个 TCP_INIT_CWND 刚开始通信的时候,会一次性发送10个数据包,然后停下来,等待接收方确认,再继续发送。

接收方每收到两个数据包,就要发送一个确认消息(acknowledgement,ACK)

ACK两个信息:

  • ACK NUM:期待要收到下一个数据包的编号
  • WINDOW:接收方的接收窗口的剩余容量

发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。 这被称为”发送窗口”,这个窗口的大小是可变的。

ACK

数据包丢失处理

​ 每个数据包都是带有下一个数据包的编号,如果下一个数据包没有收到,那么 ACK 的编号就不会改变。

​ 如果发送方收到三个连续的重复ACK 或者 超时了还没有收到任何ACK,就会确认丢包,通过这个机制,保证了包不丢失。

​ 举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。这会导致大 量重复内容的 ACK。

三次重复ACK的重发机制

参考

TCP 协议简介 - 阮一峰的网络日志 (ruanyifeng.com)

文章作者: stormling
文章链接: http://www.stormling.top/posts/14054.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 码农Stormling!
TCP
cover of previous post
上一篇
Java系列(八)| Java集合
Java核心技术 集合类Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection 接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。 Collection 接口关系图具体实现:List、Queue、Set,可以看下Collection关系图 Map 键值对关系图具体实现:Hashtable、LinkedHashMap、TreeMap,可以看下Map 关系图 1.List、Set、Queue、Map 区别 List:有序列表,可重复 Set:无序列表,不可重复 Queue:特性的排队顺序确定先后关系,存储元素是有序的,可重复 Map:使用键值对(key-value)存储 2.List、Set、Map 常用集合有哪些?List vector: 底层是数组,方法加了 synchronized 来保证线程安全,所以效率较慢,使用 ArrayList 替代。 ArrayList:...
cover of next post
下一篇
谷粒商城(三)| 前端基础
前端基础前后端对比 ES6 ECMAScript 6.0(以下简称 ES6,ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本), 是JavaScript语言的下一代标准,2015年6月正式发布,从ES6开始的版本号采用年号,如ES2015,就是ES6。ES2016就是ES7。 ECMAScript是规范,JS的规范的具体实现。 let & const 作用域:var在{}之外也起作用 let在{}之外不起作用 声明次数:var 多次声明同一变量不会报错,let多次声明会报错,只能声明一次。 变量提升:var 会变量提升(打印和定义可以顺序反);let 不存在变量提升(顺序不能反) const 声明之后不允许改变 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> ...

评论
ValineGitalk
avatar
stormling
文章
42
标签
25
分类
21
Follow Me
公告
欢迎大家来到Stormling博客
目录
  1. 1. 简介
    1. 1.1. 以太网
    2. 1.2. IP
    3. 1.3. TCP
  2. 2. TCP 数据包
  3. 3. TCP 数据包编号(SEQ)
  4. 4. TCP 数据包组装
  5. 5. 慢启动和ACK
  6. 6. 数据包丢失处理
  7. 7. 参考
最新文章
面向八股文面试专场
面向八股文面试专场2025-01-22
【每日早报】-2025-01-21 - 星期二
【每日早报】-2025-01-21 - 星期二2025-01-21
规则引擎 Drools 8+ 快速入门
规则引擎 Drools 8+ 快速入门2024-12-11
数据库系列(二) | Mybatis Plus 3.0+快速入门
数据库系列(二) | Mybatis Plus 3.0+快速入门2024-12-09
分布式系列(二) | Redisson分布式锁
分布式系列(二) | Redisson分布式锁2024-12-05
©2019 - 2025 By stormling
码农Stormling程序员,关注公众号【码农Stormling】回复【面试】获取最全面试pdf
搜索
数据加载中