白话TCP/IP协议栈

前言

最近在复习总结计算机基础知识,包括操作系统、数据结构、计算机网络等程序员必备的知识,这属于程序员的内功。把内功修炼好了,外功只是一种形式,如果你内功深厚,那么无论是用龙抓手还是用化骨绵掌都能解决敌人。在此就结合个人的理解,尽量用通俗的话解释一下TCP/IP协议栈,以及每层的协议作用。这里不谈晦涩的理论,白话交流,抛砖引玉。每部分里面为了体系完整写了些相关的拓展知识,可以跳过。

TCP/IP协议栈

之所以叫栈是因为层次上来看类似数据结构中的栈,没其他意思,也有文献称之为TCP/IP协议簇。TCP/IP协议栈是一系列互联网协议,这些协议解决了我们正常使用网络的各种问题。TCP/IP协议可以分为四层来看,每层都有对应的协议保障。这四层自上而下可以分为:应用层、传输层、网络层(或网际层)、网络接口层(或链路层)。与我们熟悉的OSI七层模型对应为:
模型对应关系

开始之前我们先模拟一下给远在天边的一位友人写信的过程,我们把要对他说的话写在信纸上,然后交给邮局,这时候邮局会让我们添加一些必需的东西,比如收信人、收信地址、邮政编码等,友人收到信其实是不关注这些信息的,他把这些东西撕掉然后看具体的信的内容。这相当于给我们的信息进行的一层“包裹”,这层“包裹”其实就是一种协议,它会保证我们的信被送到正确的地方。TCP/IP协议栈其实就是在做这个事,它保证了数据在整个网络上的正确传输。

如图:
这里写图片描述
通过这些协议的“包裹”,我们的数据得以正确的传输。
接下来就白话说一下这几层的作用和涉及到的协议以及各个协议的作用。

1.网络接口层

物理层

从上图我们可以看到,网络接口层对应OSI七层模型的数据链路层和物理层,物理层很好理解,物理层主要考虑的是如何在各种计算机直接传输数据比特流,注意这里传输的是比特流,对于通过网络进行数据传输的协议之间的通信最终都是转换成0/1电信号(借助调制解调器)进行传输,传输的通道我们称物理介质,包括双绞线、光纤、电缆等导引型传输媒介,也有一些无线电波等非导引型媒介。通俗来说,我们在网上传输任何数据最终都被调制解调器收发,并借助物理介质进行传输,这是网络通信的基石。
从信息交互方式来看,可以分为三种:

  • 单向通信:只有一个方向的通信
  • 半双工通信:通信双方都可以发送消息,但是不能同时发送和接收
  • 全双工通信:通信双方可以同时收发信息

拓展知识:

  • 信噪比
  • 香农公示,即计算信道的极限传输速率
  • 信道复用技术:频分复用、时分复用、波分复用、码分复用

链路层

我们知道物理层传输的是0/1比特流,为了让这些比特流有意义,在链路层要做好标识,因此链路层会根据每组电信号的信息特征进行分组,每组数据我们称为数据包,一个数据包称为一帧,帧是数据链路层协议数据的基本单元,结合三层模型理解如图,对电信号进行分组形成数据帧,然后借助物理介质进行发送。
这里写图片描述

如何辨别接收方身份?

整个帧包括首部、数据部分、尾部组成,首部固定14字节,包含了目标MAC地址,源MAC地址等关键信息;数据部分包括46-1500字节用于传输数据;尾部包含四个字节用于序列校验。
借助网络适配器(即网卡)对链路进行协议的“包裹”,数据包必须是从一个网卡传到另外一个网卡,网卡地址即帧首部包含的MAC地址,MAC地址全球唯一,和网络无关。有了这个信息,我们才能确定收发双方的地址。有了MAC地址后,以太网以广播的形式把数据包发给子网内的所有主机,这些主机收到数据后会比较帧首部的MAC地址是否和自己相等,相同就做处理,不同则丢弃。
因此链路层作用就是对电信号进行分组形成有价值的数据帧,然后通过物理介质以广播形式发给接收方。
拓展知识:

  • 数据链路层协议三个基本问题:1.封装成帧,为比特流数据添加首部和尾部信息包装成帧,首部尾部有帧定界的作用。2.透明传输,使用字节填充法使无论输入什么字符都可以保证传输。3.差错控制,通过循环冗余检测CRC解决比特差错。
  • 相关协议:点对点协议PPP、CSMA/CD协议

2.网络层

由于本文是从底层往上层写的,可能看到上面有人会有疑惑,如何知道接收者的MAC地址?数据包在广播的时候如果接收者不再同一个子网咋办?如何知道接收者和发送者属于同一个子网?为了解决这些问题,网络层通过三个主要的协议进行“包裹”。即IP协议、ARP协议、路由协议。

IP协议

IP地址是因特网上的每个主机(或路由器)的每一个接口分配的全世界唯一的32位标识符。 每个IP地址由网络地址和主机号组成,与MAC地址不同,IP地址和网络相关,使我们能区分两台主机是否属于同一个子网。如果两个IP地址在同一个子网内,则网络地址一定相同。

各类地址的分法不尽相同,以C类地址192.168.24.1为例,其中前24位就是网络地址,后8位就是主机地址。为了判断IP地址中的网络地址,IP协议还引入了子网掩码, IP地址和子网掩码通过按位与运算后就可以得到网络地址。
A类地址的默认子网掩码是255.0.0.0
B类地址的默认子网掩码是255.255.0.0
C类地址的默认子网掩码是255.255.255.0

因此根据应用层传入的IP地址信息我们可以确定收发双方是否属于同一个子网。

ARP协议

ARP协议即地址解析协议,可以根据IP地址获得对应的MAC地址,与之相反还有RARP逆地址解析协议。

ARP协议具体过程为:
首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

路由协议

上述协议都有局限,即都是在同一个子网下,不在一个子网怎么办呢?因此引入了路由协议。回想上述步骤,根据IP协议判断收发双方是否在同一个子网,如果再,则使用ARP协议查询相应的MAC地址,然后广播数据包。如果不在,该数据包会转发给本子网的网关进行路由,多次路由之后找到目标IP所在的子网,再通过ARP获得MAC地址,然后以广播形式发送数据包。完成路由协议的物理设备就是我们常说的路由器。

因此网络层主要工作是定义网络地址并区分网段、确定MAC地址,对不同子网的数据包进行路由。

拓展知识:
网络层被“包裹”的数据称为IP数据报,由首部、数据部分两部分组成,首部长20字节,包括目标IP、源IP。数据部分最大传输65515字节数据,超过部分需要进行分割,多帧传输。

3.传输层

经过上面两步,数据已经可以从互联网上的一个主机发往另一个主机了,但是对于数据包来说,其实是从主机上的某个应用程序(进程)发往另一个主机的应用程序(进程)的。如何标识这些应用程序(进程)呢?答案是:端口。对于不同主机的应用程序来说,都有一个唯一的端口,端口号不会冲突。可以这么说,网络层为主机之间提供了逻辑通信,而运输层为应用进程之间提供了端到端的逻辑通信。那端口信息由何而来呢?UDP协议“包裹”了端口信息,UDP协议定义了端口号并且规定网络中传输的数据包必须加上端口信息。UDP数据包由两部分组成:首部、数据部分,其中首部长8字节,定义了目标端口、源端口。数据部分最大65527字节。在运输层还有一个关键的协议即TCP协议,TCP协议是UDP协议的“强化版”,TCP协议是有确认机制的UDP协议。

TCP和UDP协议主要特点如下:
UDP:
(1)UDP是无连接的,发送数据之前不需要建立连接,减少了开销和发送数据之前的时延。
(2)UDP使用尽最大努力交付
(3)UDP是面向报文的
(4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。
(5)UDP支持一对一、一对多、多对一和多对多的交互同信。
(6)UDP的首部开销小,只有8字节,TCP20字节。
TCP:
(1)TCP是面向连接的运输层协议。
(2)每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能点对点的。
(3)TCP提供可靠的交付。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
(4)TCP提供全双工通信。
(5)面向字节流。TCP中的“流”指的是流入到进程或者从进程流出的字节序列。

拓展知识:
TCP如何保证可靠传输的?

  • 停止等待协议
  • 滑动窗口ARQ协议
  • 三次握手

TCP拥赛控制、流量控制:

  • 慢开始
  • 拥赛避免算法
  • 快重传
  • 快恢复

4.应用层

通过上述三个“包裹”,数据可以正确传输了,但是就拿写信来说,我的朋友都很笨,只会中文,如果我用英语写信他们是看不懂的,因此我们会约定好使用中文交流。而应用层作用就是定义各种协议来规范数据格式,使程序方便识别。应用层常用协议有:DNS、HTTP、FTP、TELNET、SMTP等,这些协议规定了数据的格式,如json、txt、html等。收发双方都要遵循相同的协议格式进行数据传输。

总结:

当我们在浏览器敲下一个域名时,从TCP/IP协议栈的角度我们看看发生了什么:

  1. 应用层协议定义了通信的格式,这里使用即“包裹了”一层http协议
  2. 传输层给双方加上端口号,确定通信的应用程序,即“包裹”UDP协议
  3. 网络层加上双方IP地址,确定双方网络位置,即“包裹”IP协议
  4. 链路层加上双方的MAC地址,确定了双方物理位置。并对数据进行分组,即“包裹”成帧。
  5. 通过物理介质发送给接收方。
  6. 接收方根据协议层层解析得到原始数据,然后根据http传入的数据格式进行读取。

链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;
网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;
传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;
应用层:定义数据格式,并按照对应的格式解读数据。

参考:
《计算机网络 谢希仁 第7版》
http://blog.csdn.net/basycia/article/details/51880172
https://www.cnblogs.com/onepixel/p/7092302.html

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值