文前小谈
网络协议、数据传输之所以让人不愿深入或是浅尝而已便已心力交瘁,在我看来,不在于它们有多难理解,而是我们常会忽略他们贴近生活的一面,而随着学习的深入,我发现这种感觉也在不断加深。第一次接触网络协议,手握400页厚书,神秘感、害怕(挂科)、好奇,心里五味杂粮,结果摊上了一个只会练PPT的老师,可悲、可恨…不过没关系,生活总是向上的,我现在明白它其实可有趣了就行了。
数据包的传输其实和“寄快递”非常相似,前辈们的智慧也是非常让人敬仰的,接下来我会将自己学到的一些知识点串联起来,以讲故事的形式进行总结和整理,主要是总结TCP/IP协议中几个主要协议的职责。
不妥之处,感谢提出。
正文预热
了解一下基本知识,方便正文理解。
预热一、为何需要协议
无“规则”不成“方圆”
【具体介绍】
这里的“规则”指的是在计算机网络中为了进行有秩序、高效的数据交换而建立的规则、标准或相关约定的集合,而这就是网络协议。那“方圆”是什么?我认为是有秩序、能够高效通信的网络环境。
网络协议由三要素组成:语义 - 要做什么,语法 - 要怎么做,时序 - 做的顺序。
计算机之间必须使用相同的网络协议进行通信,不过当然类似人类语言的多样性,网络协议也是有多种,而具体选择哪一种就就要看情况而定(下面扩展有讲),在Internet这个地域上用的就是咱们常说的TCP/IP协议。
预热二、TCP/IP协议可是兄弟团
【具体介绍】
TCP/IP协议不是简单的一个协议,更不是仅仅包含TCP协议和IP协议,它内部包含着一整组特别的协议:TCP、IP、UDP、ARP等。那为啥取这个名? 因为其中最重要和最著名的就是TCP协议和IP协议。
正文开始
将“寄包”过程拆解出来,从而来了解和学习TCP/IP协议中几个主要子协议的工作职责:
事件一、收拾好待寄包袱

【所处背景】自家主机的应用层
【传输到下层的形式】报文或字节流
【具体介绍】数据打包压缩,如果发送数据很大,就会拆分成多个小数据包进行传输(TCP)。
事件二、选择邮寄服务并填写寄件人和收件人
这里就有意思了,计算机的数据并不是想发就发的,它们是需要选择“服务”的,不同的需求就需要不同的服务,这里就来简单介绍介绍,以下的“服务”只是为了方便理解,UDP和TCP实质为TCP/IP协议簇内的子协议。
可选服务一 UDP | 无连接(快)、丢了不管(不可靠);有单播、多播、广播的功能;首部开销小
【服务特点】
- 无连接协议,不需要建立连接后才发送数据,想发就发,丢了不管。
- 不止支持一对一的传输,同样支持一对多、多对多、多对一的传输。
- 面向报文。(下面扩展有讲与面向字节流的区别)
- 首部只包含两个十六位的端口号(源端口和目的端口)、数据报文长度、数据报文的检验和,首部开销小,仅8字节,传输也相对高效。
可选服务二 TCP | 面向连接的(可靠,相对较慢);判断丢包,丢了重传(可靠);仅支持单播
【服务特点】
- 面向连接,发送数据前需要在两端通过“三次握手”建立连接,为数据的可靠传输打下基础,但也相对较慢。为了保证报文传输的可靠,就给每个包一个序号,接收方收到后排序,保证按序接收,如果成功接收则返回相应确认(ACK)。如果发送端在合理往返时延内未收到确认,就会重传。
- 仅支持点对点的数据传输。
- 面向字节流。
- 首部包含信息多,如端口号、校验和(用于校验传递数据是否被破坏)等,有固定20字节,可扩展40字节。
【适用场景】
要求可靠传输的场景,比如发邮件等。
选好服务后包裹头添加相关信息 | 重点包含“寄件人名字”和“收件人名字”
重新看上面那张图,数据中包含重要文件,那我们肯定是首选TCP啦。
【所处背景】自家主机的传输层
【传输到下一层形式】传输协议组
【具体介绍】
这里的“寄件人名字”就是发送数据的源程序所在主机的端口,而“收件人名字”就是接收数据的目的程序所在主机端口。想象一个家庭(操作系统)中有多个人(应用程序),我们必须写清楚具体“收件人”的名字(端口),当然“寄件人”的名字也必然写上。
事件三、数据包头部继续填写地址信息
上面我们已经将“服务”选好了,也填写了“寄件人名字”和“收件人名字”,那派送的地址呢?说到这,IP协议登场了。IP协议在我看来它的职责可不是把数据包送达目的主机,而是指明送达目的地的位置,它可不跟快递小哥抢活(下面会说快递小哥是谁)。
IP协议 | 提供一种尽力而为,无连接的数据表交付服务
【特点】
尽力而为:不保证IP数据包成功到达目的地,任何可靠性需要上层提供。(也就是你要可靠的TCP还是不可靠的UDP呢)
无连接:IP不维护网络单元中数据报相关的任何连接状态信息,每个数据报独立于其它数据报来处理。使用TCP协议发送两个连续的数据报可能乱序到达目的地。
包裹头添加相关信息 | 重点包含“寄件地址”和“收件地址”

【所处背景】自家主机的网络层
【传输到下一层形式】IP数据报
【具体介绍】
这里的“寄件地址”就是数据发送方的主机IP地址,“收件地址”就是数据接收方的主机IP地址。
事件四、包裹上加上固定地址
哼?什么是固定地址?这里就假设事件三添加的收件地址为“A园B座C位”,问题是这个这个地址名是很容易被修改的,有可能改天就变成了“D园E座F位”,这让快递员就不太好找位置了,所以快递小哥很聪明,如果你不写固定地址,我就不送了。这时候,我们就得被迫写上接收方固定地址了,像“XX大道XX号”。(为什么这么做可以看下方扩展 IP地址 vs MAC地址)这里的“固定地址”指的是MAC地址。
那怎么找到这个固定地址呢?这时,名叫“ARP协议”的老哥就出来了。
ARP协议 | 地址解析,通过“一问一答”找到IP地址到MAC地址的映射
【具体介绍】
它如何找到这个映射呢?说出来怕你不信,靠问。
- 一开始,它先向操作系统吼一声“某某IP地址的MAC地址是什么?”,如果操作系统知道就直接告诉它。
- 如果操作系统不知道(操作系统的ARP缓存表中无相应的IP和MAC的映射),那这时发送方便会通过广播的方式问“我的IP地址是xx,MAC地址是xx,谁的IP是某某IP,你的MAC地址是什么?你收到了请回复我。”
- 接收方收到广播就会将自己的MAC地址以单播形式回应给发送方,发送方接收到后就屁颠屁颠跑回去把这个映射写到操作系统的ARP缓存表中,然后继续往下通信。
包裹头添加双方的固定地址

【所处背景】自家主机的数据链路层
【传输到下一层形式】以太网帧
【具体介绍】
在找到接收方的固定地址后,就在网络层传下来的数据包上添加了“接收方固定地址”——接收方主机的MAC地址,当然还有自己家的固定地址。
事件五、寄件终于上路了

当信息补全后,寄件开始被派送。通过路由器/交换器(这才是快递小哥)的长途奔波,终于把寄件送到接收方主机。
不过这里的快递小哥是不认路的,不会直接送去接收方主机,也是一路靠问,直至问到MAC地址配对上。
事件六、验证并确认收货
如何进行验证?
【具体介绍】
- 验证MAC地址:接收方收到以太网帧后,会在数据链路层取下首部解析,判断其MAC地址是否和自己的一样,如果是,认为是传给自己的,把剩下的扔给自身的网络层处理;否则扔掉。
- 验证IP地址:网络层发现来了新的数据报,会把首部解析出来,并验证首部的IP是否和自己的一样,如果一样则认为是传给自己的,把剩下的扔给自身传输层对应协议(如TCP、UDP)处理;否则扔掉。
- 验证数据完整性:传输层的对应协议收到数据后取下首部并解析,计算校验和用于判断是否文件被破坏,检测序号组合文件判断完整性,如果最后确定数据都没问题,检查端口号(收件人名字),确定具体的“收信人”,将数据传给端口号识别的应用程序(也就是咱们整篇文章的重要一角:收件人)。
(如果是UDP协议,取下首部后就把报文传给楼上应用层,不带一丝犹豫,这里的例子是TCP协议)
- 确定收货:处于应用层的对应应用程序将接到的信息进行解析并展示。
值得一提的是,当TCP验证数据没问题后还会给发送方报平安,如果长时间没有接收到回应,发送方会认为包裹丢失然后自认倒霉地重发,直至收到对方的“报平安”。
文后扩展
扩展一些相关的知识点
扩展一、常用通信协议
注意了,这里的协议并非TCP/IP协议簇中的子协议,而是与TCP/IP协议持“平等”地位的通信协议。
TCP/IP协议 | 最重要最流行、但配置麻烦、通信效率不高
【大概介绍】
互联网的基础协议,任何与互联网有关的操作都离不开TCP/IP协议。它是目前最流行的网络协议,但仍有不足:
- 它在局域网中的通信效率并不高,常会出现不能正常浏览“网上邻居”计算机的情况。
如何解决?安装NetBEUI协议。
- 配置相当的麻烦,比如要详细设置IP地址,网关,子网掩码,DNS服务器等参数。
NetBEUI协议 | 短小精悍、通信效率高的广播型协议
【大概介绍】
NetBIOS协议的增强版本,曾被许多操作系统采用。NetBEUI协议是一种短小精悍、通信效率高的广播型协议,安装后不需要进行设置,特别适合于在“网络邻居”传送数据。所以建议除了TCP/IP协议之外,小型局域网的计算机也可以安上NetBEUI协议。
IPX/SPX协议 | 游戏联机首选,配置省事,除此别无他用
【大概介绍】
大部分可以联机的游戏都支持IPX/SPX协议,比如星际争霸,反恐精英等。本来TCP/IP协议也是可以联机的,但是它的配置异常麻烦,所以还是使用IPX/SPX协议比较省事。
该协议在非局域网络中用途不大,要不是“省事”这一优势,怕是没活路。
扩展二、UDP面向报文 vs TCP面向字节流
TCP面向字节流 | 若数据块太长,每次控制长度,分多次发送;太短,则积累到一定长度才发送
【具体介绍】
发送方的TCP把上面应用层交下来的数据看成无结构的字节流来发送,也会将数据放入“蓄水池”(发送缓存区),但是它的缓冲区与UDP的不同,当缓冲区容不下,可以让上层应用程序先停止发送数据,等待有空余空间后才让其继续发送;如果上层不听安排仍继续发送数据,则数据的超出部分会被丢弃。<br />TCP会根据当前网络的拥塞状态来确定每个报文段的大小,如果传送数据块太大则划分短一些再传送;如果太小,则会等待积累有足够多的字节后再传送。<br />接收方TCP收到数据后确认后必须给予确定,当发送方TCP收到对方确定后才会将发送缓存区的数据删除。
TCP是面向字节流的,但是发送时仍会将字节重新构成报文段发送出去。
为什么存在这种差异
【原因】
因为TCP协议是面向连接的协议,数据包上带有序号,接收方收到后会进行排序验证和组合,所以可以通过多次发送数据实现数据传输;但是UDP协议是无连接协议,接受方根本不知道前后两个接收到的包是不是连续的,当然实际上也不会去考虑这个,它每次只会读取一个,读取后直接“去头扔楼上应用层”。
扩展三、IP地址 vs MAC地址
IP地址 | 逻辑地址、易被更改
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
【特点】何谓逻辑地址?容易被更改的,不具有唯一性。
MAC地址 | 物理地址、不易更改
物理地址、硬件地址,用来定义网络设备的位置。
【特点】何谓物理地址、硬件地址?地址很难被更改,具有唯一性,与电脑硬件设备有关,在出厂时已经固定。
它们有什么关联?
原本网络管理在网络层针对IP地址进行管理即可,但是IP地址可以由用户自行设定,管理起来相对困难,利用MAC地址一般不可更改的特点,将IP地址和MAC地址组合到一起管理更加方便省心。
为何要使用MAC地址 | 标识用户可比IP地址靠谱
如今比较流行的接入Internet的方式(也是未来发展的方向)是把主机通过局域网组织在一起,然后再通过交换机和 Internet相连接,在这种情况下,我们如何区分具体用户,防止身份盗用呢?
由于IP只是逻辑上标识,任何人都随意修改,因此不能用来标识用户;MAC地址则不然,它是固化在网卡里面的。从理论上讲,除非盗来硬件(网卡),否则是没有办法冒名顶替的。
具体如何通信(结合使用IP地址和MAC地址)?
接收过程,当有发给本地局域网内一台主机的数据包时,交换机接收下来,然后把数据包中的IP地址按照“表”中的对应关系映射成MAC地址,转发到对应的MAC地址的主机上,这样一来,即使某台主机盗用了这个IP地址,但由于他没有这个MAC地址,因此也不会收到数据包。
扩展四、TCP/IP协议网络模型
TCP/IP协议的网络模型官方认证是四层(数据链路层与物理层共同看做网络接口层),五层只是一种折中的表示,或是更好的表示。不过怎样都无所谓,个人认为没必要去钻这牛角尖,知道其分类的思路就好。上文基本将各分层的职责都讲了一遍,其余的就不深入了,此图只做参考。
扩展五、TCP连接的三次握手
第一次握手 | 客户端要和服务端建立连接,向其发送邀请
第二次握手 | 服务端告诉客户端收到了连接消息
通过发送回连接信号SYN,同时发送自己的初始序列号和客户端传过来的初始序列号+1让客户端知晓;
第三次握手 | 客户端告诉服务端说我收到你准备好的消息了,那就来愉快“玩耍”吧
通过发送回自己的初始序列号+1和客户端传过来的初始序列号+1让服务端知晓;
+1 的作用在于让对方确切知道这人的确是收到了我的消息

