网络篇(四):《图解 TCP/IP》读书笔记
myzbx 2025-04-24 05:30 17 浏览
大家好,我是 杰哥
网络知识专栏的推送,依旧在继续~今天要推荐的是:《图解 TCP/IP 》
再次看完一本网络的书籍,更加感觉到网络中常用的知识其实也就那么多,只是不同的作者会根据自己的经验,站在不同的角度进行讲解而已
而通过阅读多本网络书籍,则可以站在不同的角度,使得自己在查漏补缺的基础上,碰撞出更多的火花,从而对于这个体系的印象不断加深
这本书与之前的两本书《网络是怎样连接的》、《趣谈网络协议》还是有很多交集的,比如说都有着重介绍 TCP 的可靠性实现原理,TCP 与 UDP 的不同之处,OSI 参考模型以及 TCP/IP 分层模型,以及 IP 协议的相关技术:DNS、ARP、ICMP、DHCP、NAT 以及 IP 隧道等。而这些基本上在之前的网络知识专栏中都有介绍,只是会有粒度的粗细、角度的不同等区别,因此本次笔记只列出了一些之前未提到过的内容
一、网络类型
1、共享介质型网络
有两种介质访问控制方式:
2、非共享介质型网络
网络中的每个站直连交换机的各个端点,由交换机负责转发数据帧,发送端与接收端不共享介质,因此很多情况下采用全双工的通信方式
二、IP 地址的基础知识
1、IP 多播
1)可以同时给特定的组内成员发送,并且可以穿透路由(广播无法穿透路由)
2)使用 D 类地址,即首位 IP 地址为 “1110”
2、如何解决全局地址不够用的问题?
说起来,有以下三种方法:
- CIDR 与 VLSM
CIDR:采用任意长度分割 IP 地址的网络标识和主机标识
VLSM:可随机修改组织内各个子部门的子网掩码长度的机制
而 CIDR 与 VLSM 结合,相对缓解了全局 IP 地址不够用的问题
- NAT
在每个终端设置私有 IP 地址,而在路由器(宽带路由器)或者必要的服务器上设置全局 IP 地址。如果配有私有 IP 的主机需要联网时,则通过 NAT 进行通信
- 代理服务器
采用少数设置全局 IP 地址的代理服务器结合 NAT 的设置进行互联网通信。在这种情况下,IP 地址个数就不局限于 LAN 中主机个数,而是由代理服务器和 NAT 的个数决定,所以会大大降低全局地址的使用频率
4、差错控制区别
七层模型中,数据链路层、网络层以及传输层都有差错控制的机制,那么他们的差错控制都有什么区别呢?
实际上,七层模型是在尽量保证可靠的传输,即要尽可能地做到:不错(没有比特差错),不丢(丢包),不乱(按序到达)。而每一层只需要校验本层的数据不发生错误即可
- 数据链路层
是为了防止网卡软硬件 bug、电缆不可靠、信号干扰而造成信号失真的数据错误,也就是只负责单个帧的正确性检查。如果不检查,将一直到达目的地主机,很有可能到达传输层才会校验出错误
- 网络层
网络层的校验只用于针对网络层的头部的正确性检查。好比货车司机只管车,车跑得好他就放心了。箱子里的水果坏没坏是传输层的事,它是不用管的
- 传输层
是对于路由器内存故障或程序漏洞导致的数据是否被破坏的问题检查
5、既然IP层会分片,为什么 TCP 层也还要分段?
首先,对于一次网络交互需要传输的数据量太大时,就需要对数据分块进行传输。这个行为在 TCP 里,叫分段,在 IP 层,叫分片。那么,达到多大才需要分呢?TCP 层,叫 MSS, IP 层,叫 MTU
- MSS是什么?
MSS:Maximum Segment Size ,段的最大字节数,是 TCP 用来限制应用层最大的发送字节数
MSS 会在三次握手的过程中传递给对方,用于通知对端本地最大可以接收的 TCP 报文数据大小,在每次执行 TCP 发送消息的函数时,会重新计算一次 MSS 的值,用于后续的分段操作
- MTU是什么?
MTU: Maximum Transmit Unit,最大传输单元。这个是由数据链路层提供,为了告诉上层 IP 层,自己的传输能力是多大。IP 层就会根据它进行数据包切分。一般 MTU=1500 Byte
假设 IP 层有小于等于 1500 byte 数据需要发送,只需要一个 IP 包就可以完成发送任务;假设 IP 层有大于 1500 byte 数据需要发送,则需要分片才能完成发送,分片后的 IP Header ID 相同,同时为了分片后能在接收端把切片组装起来,还需要在分片后的 IP 包里加上各种信息。比如这个分片在原来的 IP 包里的偏移 offset
- MTU 与 MSS 的关系
即
MSS = MTU - 20(IP Header) -20 (TCP Header)
那么,既然 IP 层会分片,在 TCP 层为何还要分段呢?
1)数据在 TCP 分段,其实是为了在 IP 层不需要分片
只要以链路中最小的 MTU 所对应的 MSS 进行数据发送即可实现 IP 的不分片,而当 MTU 的值一旦确定了,MSS 也就随之确定了,因此便可以实现 在 TCP 分段之后,在 IP 层不再需要分片了
- 而 IP 层是如何实现不分片的呢?
设想一下,当链路中存在多个 MTU 时,刚开始以一个比较大的 MTU 发送时,在中间遇到了比较小的 MTU 时,必然需要进行分片。所以,只需要在发送数据前,找到链路中最小的 MTU,并以这个 MTU 进行数据的发送,则全程都不会涉及到数据的分片操作了
2)减少网络带宽的消耗
TCP 为了保证可靠性具有重传机制。分段之后,当发生重传的时候,只需要重传分段后的小份数据,不用再重传原来比较大的数据了,这样可以减少网络带宽的消耗
三、IP 协议
1、MTU 不同
不同的数据链路,有不同的 MTU(最大传输单元),主要是不同类型的数据链路的使用目的不同
2、IP 报文的分片与重组
规定只能在终结点(目标主机)进行被分片数据的重组
3、路径 MTU 发现
获得从发送端主机到接收端主机之间不需要分片时的最大 MTU 的大小,即路径中存在的所有链路中最小的 MTU,从而避免在中途的路由器上进行分片处理
总结
以链路中最小的 MTU 进行发送,并规定在目标主机才会进行数据的重组,那么就会实现在发送端主机进行分片,在接收端主机进行重组的效果,避免过程中的频繁重组、分片带来的网络效率降低的问题
四、路由控制协议
1、RIP
1)Routing Information Protocol,路径信息协议。将路由控制信息定期(30 s)向全网广播,若超过 5 次 未收到路由控制信息,连接断开
2)根据距离向量确定路由
选择路由器个数最少的路径(即距离最短的路径)
3)RIP 的无限计数问题:收到自己发出去的消息
解决方法:
a. 最长距离不超过 16。由此即使发生无限计数问题,也可以从时间上进行控制
b. 规定路由器不再把接收到的路由信息返还给发送端,即水平分割
有环路时,还需要以下方法来解决:
a.毒性逆转
直接将无法通信的消息传播出去
b.触发更新
当路由信息发生变化时,不等待 30 s,而是立刻发送出去
2、OSPF
Open Shortest Path First,开放最短路径优先。是一种基于链路状态的路由协议,选择总的代价较小的路径
相对于 RIP 协议来说:
1)通过引入区域的概念,减少计算负荷,即每个路由器向其同一管理域的所有其他路由器发送链路状态广播信息,而不是全网
2)不用像 RIP 协议那样,定期交换相同的路由控制信息,浪费带宽,而是发生变更时,只推送变更的信息
3、BGP 协议
是一种路径向量协议。类似于距离向量协议:RIP。但它不仅包含了转发的方向和距离,还涵盖了途经所有 AS(自治系统)的编号,并且能够检测出环路
五、应用层协议
1、电子邮件
为了解决邮件接收方在没有开机的情况下,无法接收到邮件的问题。在邮件的发送方与接收方之间,增加一台邮件服务器,用于接收发送端的所发送的邮件
根据 SMTP 协议将被转发给一直处于插电状态的邮件服务器,接收客户端再根据 POP 协议或者 IMAP 协议从邮件服务器接收对方发来的邮件
POP 协议和 IMAP 协议都属于接收电子邮件的协议。但两者还是有区别的:
POP(Post Office Protocol):邮局邮件协议,由客户端将电子邮件下载本地,对邮件进行本地的操作
IMAP(Internet Mail Access Protocal):交互式邮件访问协议。由服务器直接进行电子邮件的管理,客户端不用将电子邮件下载到本地便可进行操作
2、SNMP-网络管理协议
可以读写 MIB 的信息,实现信息收集、修改,路由器、设备启停等
MIB(Management Information Base):管理信息库,由监控网络中某个接口设备(点)的众多参数组成。包括受管设备必须保存的数据项、允许对每个数据项进行的操作及其含义等信息
RMON(Remoting Monitoring MIB):远程监控的 MIB。由监控网络上线路的众多参数构成(线)
因此,RMON,可以实现以终端或者协议为单位进行监控。是判断当前网络是否被充分利用的重要资料
六、提高网络利用率的规范
1、Nagle 算法
需要一直等到满足以下两个条件的其中一个,才可以发送
- 1)已发送的数据都已经收到确认应答时
- 2)可以发送最大段长度(MSS)的数据时
优点:网络利用率大
缺点:会发生某种程度的延迟
2、延迟确认应答
- 原因
接收数据的主机,刚接收完数据,缓冲区往往是满着的。这个时候如果立即返回确认应答,那么应答的窗口的大小是偏小的
- 机制
收到数据以后,并不立即返回确认应答,而是延迟一段时间返回
3、捎带应答
TCP 的确认应答和回执数据可以通过一个包发送。通过启用延迟确认应答来实现
可以减少收发的数据量,是提高网络利用率从而降低计算机处理负荷的一种较优的处理机制
七、传输层协议
除了 UDP 和 TCP 协议以外,还有如下几种较为常用的协议:
1、UDP-Lite
轻量级用户数据报协议,是 UDP 的修正版协议,实现校验和的范围由应用自行决定,只针对不允许发生错误的部分进行校验和的检查,对于其他部分,即使发生了错误,也会被忽略不计
2、SCTP
流控制传输协议,是 TCP 的一种扩展协议。支持多重宿主,即对于同一台主机有多个网卡的情况,即使其中的以太网与无线 LAN 之间的切换,也能够保持通信不中断
3、DCCP
在 UDP 基础上进行拥塞控制的一种协议
八、为什么 UDP 和 TCP 都有一个伪首部?
伪首部的内容包括源 IP 地址,目标 IP 地址,协议号
由于 UDP 的首部只包含通信 5 要素中的其中两个:源端口和目标端口,因此增加了需要的 3 项:源 IP 地址,目标 IP 地址,协议号。只有对于这 5 要素进行校验,才有意义
九、总结
好了,《图解 TCP/IP 》的读书笔记就这些了。最近时间的确是不够用,这本书也是每天挤出时间来看的~
看完之后,你会发现随着对网络体系了解得越来越多,得到的不仅是更多的网络知识,还能够看到网络中的一些比较优秀的架构设计思路。比如网络的分层、各个网络层的独立封装、类似于发布订阅思维的邮件服务器的引入等思想
嗯,就这样。每天学习一点,时间会见证你的强大~
欢迎大家关注我们的公众号,一起持续性学习吧~
往期精彩回顾
总结复盘
架构设计读书笔记与感悟总结
带领新人团队的沉淀总结
复盘篇:问题解决经验总结复盘
网络篇
网络篇(二):《趣谈网络协议》读书笔记(二)
网络篇(一):《趣谈网络协议》读书笔记(一)
事务篇章
事务篇(四):Spring事务并发问题解决
事务篇(三):分享一个隐性事务失效场景
事务篇(一):毕业三年,你真的学会事务了吗?
Docker篇章
Docker篇(六):Docker Compose如何管理多个容器?
Docker篇(二):Docker实战,命令解析
Docker篇(一):为什么要用Docker?
..........
SpringCloud篇章
Spring Cloud(十三):Feign居然这么强大?
Spring Cloud(十):消息中心篇-Kafka经典面试题,你都会吗?
Spring Cloud(九):注册中心选型篇-四种注册中心特点超全总结
Spring Cloud(四):公司内部,关于Eureka和zookeeper的一场辩论赛
..........
Spring Boot篇章
Spring Boot(七):你不能不知道的Mybatis缓存机制!
Spring Boot(六):那些好用的数据库连接池们
Spring Boot(四):让人又爱又恨的JPA
SpringBoot(一):特性概览
..........
翻译
[译]用 Mint 这门强大的语言来创建一个 Web 应用
【译】基于 50 万个浏览器指纹的新发现
使用 CSS 提升页面渲染速度
WebTransport 会在不久的将来取代 WebRTC 吗?
.........
职业、生活感悟
你有没有想过,旅行的意义是什么?
程序员的职业规划
灵魂拷问:人生最重要的是什么?
如何高效学习一个新技术?
如何让自己更坦然地度过一天?
..........
相关推荐
- 怎么恢复7z文件 7z文件删除了怎么恢复
-
7z是一种压缩格式的文件,它运用LZMA压缩算法,该压缩算法的输出稍后被算数编码进行处理以便后续进一步压缩,压缩比十分高。我们可以将文件压缩成这种格式,便于传输,保存,占空间少。了解更多7z文件知识...
- 郎酒让消费者喝得明明白白 算术题里有答案
-
日前,『郎酒酱香产品企业内控准则』颁布,郎酒首次公开酱香产品生产全过程,公布酱香产品产能、储能及投放计划。随后,郎酒官微向消费者发出「品控算术题」有奖问答。郎酒亮出家底,消费者踊跃留言。8天后,谜底揭...
- 学龄前,比识字、算术更重要的是这三件事
-
“为了给孩子选择一家合适的幼儿园,我曾穿梭于纽约各家幼儿园的开放日,这些幼儿员既包括主流的公立幼儿园,还包括那些遥不可及的私人幼儿园。我的目的就是想了解他们的教育理念是什么,到底厉害在哪里,看看对于我...
- 参加CSP-J信奥赛需要掌握数学知识
-
在C++语法的学习中需要储备的数学知识如下①数据类型:需要知道整数、正整数、负整数、小数、判断对错②算术运算符:加法、减法、乘法、除法、取模运算③关系表达式:大于、大于等于、小于、小...
- 1g米饭能做多少深蹲?今天我们来算一算
-
减重我们都知道3分在练,7分在吃,吃这件事情上,真的是每一口都算数。今天我们来算一笔账,1粒米饭可以做多少事情?本着认真负责的态度,今天在食物秤上称了1g米饭,是16粒。根据能量换算:100g米饭是4...
- web 自动化测试,一定得掌握的 8 个核心知识点
-
使用cypress进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用JavaScript作为编程语言。传统主流的selenium框架是支持多语言的,大多数QA会的pytho...
- 大话C语言:赋值运算符(c语言中赋值运算符是什么)
-
赋值运算符是最基本的运算符之一,用于将右侧的值或表达式的计算结果赋给左侧的变量。它是一个二元运算符,意味着它需要两个操作数:一个是目标变量(左侧),另一个是要赋给该变量的值或表达式(右侧)。赋值运算符...
- Vue进阶(幺幺伍):js 将字符串转换为boolean
-
Boolean();参数为0、null和无参数返回false,有参数返回true。Boolean("");//输出为:falseBoolean(null);//输出为...
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
-
1).大于,小于,大于或等于,小于或等于$gt:大于$lt:小于$gte:大于或等于$lte:小于或等于例子:db.collection.find({"field":{$gt:valu...
- Python学不会来打我(21)python表达式知识点汇总
-
在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...
- C|数据存储地址与字节偏移、数据索引
-
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表示位置偏移,异质结构的结构体通过其...
- 下班后累懵?4 个 JS 手写题帮你搞定前端面试高频考点
-
打工人下班后最痛苦的事,莫过于拖着疲惫的身子还要啃前端面试题吧?看着那些密密麻麻的JS代码,脑子都快转不动了!别担心,今天咱就用轻松的方式,带你吃透4道高频手写题,让你在面试时自信满满,再也不...
- 嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门
-
sqlite在《嵌入式数据库sqlite3命令操作基础篇-增删改查,小白一文入门》一文中讲解了如何实现sqlite3的基本操作增删改查,本文介绍一些其他复杂一点的操作。比如where、orderby...
- 前缀表达式与后缀表达式(前缀表达式后缀表达式中缀表达式计算)
-
昨天晚上和儿子一起学习了前缀表达式和后缀表达式。这应该是字符串算式如何被计算机识别并计算的2种方法。本来是想先给他讲一个逆波兰式(后缀表达式),以后再讲前缀表达式。没想到他还挺聪明,很快就把2个都掌握...
- Python快速入门教程1:基本语法、数据类型、运算符、数字字符串
-
Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、运算符、数字和字符串等内容,并附有使用实例场景。Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)