阿牛教你 TCP/IP

本贴最后更新于 1998 天前,其中的信息可能已经物是人非
阿牛教你 TCP/IP

人类之所以能够在历史变迁中逐步进化为高级文明,其中必不可少的因素就是 语言以及制度的建立完善
那么计算机时代,计算机之间进行交流,共同发展谋求进步,语言和制度也是至关重要
制度在互联网中被称之为协议,今天我们要讨论的就是 在计算机网络中 可算得上是 老大哥的 TCP/IP 协议

就是这位老大哥维持着互联网通信中的秩序,让信息有条不紊地进行传输

TCP/IP 协议族

将 TCP/IP 称之为协议族更为恰当,因为其中除了主要的 TCP, IP 协议之外,还包含有其他大量协议
大家共同构成了 这么一个网络协议
简而言之,TCP/IP 协议让电子设备走入互联网,走向城市
TCP/IP 协议分为四层,分别是应用层,传输层,网络层,数据链路层
本文我们来了解,一个消息是怎么进行传输,最终到达目的地

局域网-村民通信

有一个文静祥和的小村庄,叫它牛家村吧,在这个村庄里面人民安居乐业
某天 阿牛家里的庄稼成熟了,需要收割,一个人显然是不够的,妻子需要洗衣做饭,儿子出去上学了
这个时候他想到了自己的好基友,隔着几家的铁柱,于是呀,阿牛就朝着 铁柱家的方向吼道:铁柱,今天帮我收割粮食吧
铁柱听到阿牛的呼喊,也朝着阿牛家的方向喊到:OK,你先把前两天欠我的酒钱还来
在这个通信基本靠吼的村子,基本也能满足平时生活上的需求

局域网就好比一个小村子,与外界网络隔断开来,网络下的主机们进行交流的方式也基本靠吼(广播方式)

下面引入两个计算机网络分层

  1. 物理层
    阿牛的声音凭什么能够 传播到 隔壁屋铁柱的耳朵里
    物理老师告诉我们,声音可以通过空气传播,答对!通过空气。这里的空气就是在他们信息传播的物理介质
    那么在计算机网络的底层,也是通过物理介质将主机进行物理连接
我们常说的物理介质有 网线 以及 无线电波  

physical media
2. 数据链路层
由于呀,物理层条件有限,进行传播的信息必须是二进制流
那问题来了,机 A 霹雳帕里传递一大串 01010101 过去给机 B,B 收到之后一脸蒙蔽,这 tm 是什么东西
语文老师坐不住了,你倒是 分词断句呀

eip3

此时就需要对这组二进制流进行一个划分,规定流中不同数据段所代表的含义  
数据链路层的职责便是将 01电信号组封装成帧,对帧内的内容进行划分,并且规定每个内容段的含义  

data frame
道理我都知道,那你快告诉我 数据帧怎么能够到达目的主机呢
别急呀,前面 阿牛大喊:铁柱,帮我收割。其实隔壁 李婶 以及后屋 狗蛋也都听到了,但为什么只有铁柱答应呢,语文老师说你笨呀,这边加了 对象铁柱
没错,其实之所以说 局域网内计算机通信也基本靠吼,是因为局域网内信息通信遵循 以太网协议(通过广播的形式发送数据)
***机 A 要向 局域网内的 机 B 发送数据帧,根据以太网协议,这条信息会被广播给局域网内的所有主机,***由于数据帧的首部 指明了 目标主机的 Mac 地址(指计算机的网卡地址,唯一标示该主机,类似于例子中铁柱这个名字)
接收到消息之后的各个主机,提取数据帧首部中的 Mac 地址,与自己的 Mac 地址作比较,相同则证明该帧的目的主机是自己,收下继续进行处理,否则抛弃该帧
数据链路层的主要作用就是对电信号进行分组,划分为具有特殊含义的数据帧,之后以广播的形式通过物理介质发送给局域网内的其它主机

互联网-走向城市

阿牛有个弟弟,在很早的时候就出去打拼了,据说现在在城里还算站住了脚,不幸的消息降临,阿牛的老母亲危在旦夕,可能突然就不行了
在最后时刻想见弟弟一面,阿牛着急呀,问村长怎么办,在那个时代,还没有电话
村长说你写封信吧,我负责帮你寄出去,记得写上你弟弟在城中的地址
阿牛回家翻找 弟弟前年留下的住址便写完了一封信交给村长
村长交给邮递员,于是这一封信就被不同地区的邮递员进行传递转发,最后辗转反侧到达了弟弟手里

局域网不甘于充当井底之蛙,外面的网络世界更加多姿多彩  
于是呀,局域网也在想方设法与外界的其它局域网进行通信交流

internet

下面引入了网络层概念

阿牛的母亲去世几年之后,阿牛的弟弟在城里也发达了,提出要把哥哥阿牛一家接到城里来居住,阿牛欣慰的同时毫不犹豫就答应了
城里的生活方式对阿牛产生了巨大的影响,阿牛开始学着网上购物,在填写地址信息时,
阿牛问弟弟 这个邮编是什么呀,应该怎么填
弟弟就开始耐心解释了: 邮编相当于是一个简略的地址信息,前面四位数字可以唯一定位到某个县市,最后两位则可以定位到这个县市里的不同区了,在快递的运送过程中邮编起到了至关重要的作用呢
阿牛听完恍然大悟:搜噶~

eip4

网络层
网络层对传统的通信方式进行了改造,首先它提出了通过 IP 地址来标示互联网中的各台主机
这就好比之前所说的邮编,是一个抽象的地址,在逻辑上唯一标示 某台网络中的主机,所以也把 IP 地址称为计算机的逻辑地址
于是呀,网络中主机 都依靠统一的 IP 协议,被分发了一个逻辑地址
IP 地址由 32 为二进制数组成,但表示时通常会转化成 4 位十进制数 以 xxx.xxx.xxx.xxx 进行显示,其次,IP 地址分为两部分
前 24 位为网络地址,后面八位为主机地址,在同一个局域网内,网络地址是相同的,这就和 邮编的前四位数字有点类似了。

ip address
既然 IP 地址只是一个 逻辑意义上的地址,那么在网络中单凭 IP 地址是无法进行通信
所以咱们还得回到计算机的物理地址,也就是 Mac 地址,计算机的身份证
那么问题来了,怎么通过 主机的 IP 地址获得其对应的物理地址?

阿牛在村子里生活时忙碌惯了,到了城里开始明显不习惯,于是在弟弟的介绍下,阿牛进入了一家电子厂干活
上班第一天需要进行信息登记,班长发给了每个人一块牌子,上面有一个唯一的工号
班长说话了:都给我听好了呀,现在我开始念工号,被念到工号的 报给我名字
“01348” 阿牛低头瞅了一眼自己的牌子,忙回答:我叫阿牛
班长听到之后发给 阿牛一身工作服,示意他可以开工了

eip5

ARP 协议
那么在计算机网络中,IP 地址与 Mac 地址是如何进行映射的呢,这就要归功于 网络层的 ARP 协议了
该协议 会向数据链路层传递一个数据包,数据包的首部存放有目标主机的 IP 地址
数据链路层接收到这个数据包,老样子,将其组装成帧,然后将数据帧广播给局域网内的其它主机
其它主机接收到了该数据帧,将 IP 地址提取出来,假如与自己的 IP 地址相同,就将自己的 Mac 地址返回
但值得注意的是,ARP 协议只适用于以太网,也就是同一个局域网内

假如该 局域网内 没有一台主机能够匹配该 IP 地址,应该怎么办?
阿牛双 11 在网上买的 电饭煲终于发货了,快递一看地址,不是本地的,于是将它发送 xx 中转站
xx 中转站一看地址,查了一下自己可以到达的地区, 也到达不了,于是把这个锅甩给了 xxx 中转站
xxx 中转站一查,可以到达,于是这个电饭煲久经辗转,终于在 一个月之后到了阿牛的手上

eip6

路由协议
那么在局域网内没有能够匹配的 IP 地址,这个时候,数据帧会通过网关(不同局域网之间连接的桥梁,也就类似于例子中的快递中转站),将该数据帧
转发给其他网关,每个网关接到数据帧都是老样子,查看该局域网内有无匹配 IP 地址,有则返回结果,若无则继续转发给其他网关,直到最后有结果
在其中起着重要作用的物理设备 便是 路由器了,相当于网络世界中的交通枢纽,将信息有条不紊地进行传输转发
所以,网络层的主要工作是定义 IP 地址,区分网段,子网内 MAC 寻址,对于不同子网的数据包进行路由

互联网-可靠传输

阿牛收到了期待已久的电饭煲之后,赶紧拆开快递包装,一看,经过一个月的折腾,电饭煲都给压坏了
阿牛简直气到炸裂,但又不知道怎么办
这个时候弟弟告诉他,你可以申请售后的
首先你先和商家确认收货,之后将情况反馈给商家,让商家重新给你发一个呗
无奈的阿牛只好照做,商家也好说话,在一个星期之后阿牛收到了
崭新的电饭煲,勉强给了商家一个五星好评

传输层

那么在互联网中,信息在传递的过程中,也可能出现数据丢失的情况,可以学一下生活中的阿牛,接收端在收到消息之后进行确认,之后把确认结果也通过数据包的形式返回给发送端
发送端再根据结果来判断是否需要重新进行发送。恩,算是解决了当前的问题,但随之而来的是另外一个问题
随着互联网的发展,电脑应用也越来越多,因此按照前面的思路,在应用的开发过程中,我们需要给每一个应用添加相同的 检验信息代码。聪明的计算机工作者当然不会这么傻,
于是,他们把这段可以通用的代码单独抽取了出来,继而演化成 传输层的 TCP 协议

传输层的协议

TCP 协议
之前说过,互联网中数据在传输的过程中可能会出现掉包的情况,需要有确认机制来保证数据传输的可靠性
TCP 协议当之无愧的安全管家

首先 它会在 将要进行通信的两台主机间 建立连接,这个连接是持续的
建立连接的过程类似下面的对话,会进行三次握手
机 A 对机 B 说:B,我给你发个信息吧
B 听到之后回:行呀,快发吧(拭目以待)
A:好的,我这就给你发!

没错就是这么麻烦,由于在发送消息前需要进行如上的智障对话
所以可想而知,TCP 协议虽然提高了数据传输的可靠性,但与此同时带来了
效率问题,速度会变得很慢。
这个时候另外一个 传输协议因运而生 就是 UDP 协议

UDP 协议
相对于 TCP 协议,UDP 可谓是相当粗暴
你只要将数据包给它,并告诉它目标主机的地址,二话不说就给你传出去了,至于消息有没有准确送达,呵呵 I don't care~
由于少了消息的校验,传输速度得到了改善,但是数据准确性却不能够保障

鱼和熊掌不可兼得,所以在选择应该使用哪种传输协议时,需要根据实际情况来进行判断
例如 有的应用对信息的准确度要求很高,但是对效率没有太多的要求,这个时候便可以考虑使用 TCP 协议了
反之 则可以使用 UDP 协议
另外,在 TCP UDP 协议同时也引入了 端口号的概念

端口
之前说过,一台电脑中会有多个不同的应用程序
那么我们得区分消息是哪一个应用发送的,以及应该发给目的主机中的哪个应用
端口号相当于应用程序在电脑中的门牌号,用来区分不同的应用程序,会跟随 IP 地址一起封装在 IP 数据包中
传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP 协议可以保证数据传输的可靠性

互联网-应用层标准化

internet application
终于到达了我们所熟悉的应用层了,不同应用间发送的数据格式可能会有所差异
按照之前的做法,由于传输层发送的数据包格式都一样,接收端接收到了数据包后,根本不知道应该怎么解析该数据包
应用层的出现就是为了解决此问题的,通过给 不同类型的应用程序定义专属的协议,从而规范了该应用下数据包的格式
例如 web 应用使用的 http 协议,文件传输应用使用的是 ftp 协议,而邮箱应用使用的是 smtp 协议

http 协议
浏览器在发送 http 请求时 按照 http 所规定的格式封装数据包
那么数据包到了的服务器应用之后,它也按照 http 规范解析数据包
那么在数据传输的过程中,效率,准确性都会提高很多

总结归纳

  • 链路层:对 0 和 1 进行分组,定义数据帧,确认主机的物理地址,传输数据
  • 网络层:定义 IP 地址,确认主机所在的网络位置,通过 IP 进行 MAC 寻址,对外网数据包进行路由转发
  • 传输层:定义端口,确认主机上应用程序的身份,将数据包交给对应的应用程序
  • 应用层:定义数据格式,并按照对应的格式解读数据
  • 网络
    128 引用 • 177 回帖 • 3 关注
  • TCP
    30 引用 • 38 回帖 • 2 关注
  • 后端
    45 引用 • 126 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • xiaomingpapapa 1
    作者

    老哥们,暂时图片无法加载,因为我把 github 作为图床了,可能访问时有些问题,稍后我会进行更新修改