白话TCP/IP协议栈

2023-05-16

前言

最近在复习总结计算机基础知识,包括操作系统、数据结构、计算机网络等程序员必备的知识,这属于程序员的内功。把内功修炼好了,外功只是一种形式,如果你内功深厚,那么无论是用龙抓手还是用化骨绵掌都能解决敌人。在此就结合个人的理解,尽量用通俗的话解释一下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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

白话TCP/IP协议栈 的相关文章

  • CMakeLists.txt常用语法

    0 绪 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 1 常用命令 1 1制定cmake最小版本 cmake minimum require
  • Vue 模板

    原文 在Vue中 xff0c Vue模板对应的就是Vue中的View xff08 视图 xff09 部分 xff0c 也是Vue重中之一 xff0c 而在Vue中要了解Vue模板我们就需要从两个方面来着手 xff0c 其一是Vue的模板语法
  • Ubuntu:系统分区

    在系统分区之前 先进行磁盘分区 这里针对的是window10系统下安装ubuntu双系统 需要在window10下进行磁盘分区来安装ubuntu系统 一 磁盘分区 win10系统下 右击此电脑 xff0c 点击管理就进入磁盘管理 这时候可以
  • Mac 安装node.js

    Mac系统安装Node js xff0c 下载地址 如上图安装路径 xff1a This package will install Node js v16 19 1 to usr local bin node span class toke
  • MySQL 常用函数(二)

    ABS函数 xff1a 求绝对值 绝对值函数 ABS x 返回 x 的绝对值 正数的绝对值是其本身 xff0c 负数的绝对值为其相反数 xff0c 0 的绝对值是 0 span class token keyword SELECT span
  • MyBatis Mapper常用动态SQL之foreach 、if、choose、where、when

    if语句 lt if gt 判断语句 xff0c 用于单条件分支条件判断 使用 lt if gt 元素对参数username和jobs进行非空判断 xff0c 并动态组装SQL xff1a span class token keyword
  • Java 查看官方Java API文档

    话不多说 xff0c 直接上方法 打开官网址 xff1a http www oracle com technetwork cn java javase downloads index html 方式一 在线浏览 点击Java 文档 xff1
  • iOS-微信分享成功回调问题

    本人用ShareSDK做分享和第三方登录 xff0c 登录先不讲 xff0c 本节只做分享成功或失败后回调问题 相信好多人会有这个疑惑就是在微信分享成功后没有成功后的方法回调 xff0c 我在ShareSDK论坛也发表过帖子问过 xff0c
  • iOS-常见三种加密(MD5、非对称加密,对称加密)

    任何应用的开发中安全都是重中之重 xff0c 在信息交互异常活跃的现在 xff0c 信息加密技术显得尤为重要 在app应用开发中 xff0c 我们需要对应用中的多项数据进行加密处理 xff0c 从而来保证应用上线后的安全性 xff0c 给用
  • iOS-开辟子线程(NSThread、NSOperationQueue、GCD)

    本节主要总结一些开辟子线程的常用的几种方法 一 通过NSThread类开辟子线程 1 NSThread手动开启子线程 span class hljs comment 创建线程对象 span span class hljs built in
  • Mac 安装 IntelliJ IDEA 以及激活方法

    之前一直在苹果移动端开发 xff0c 这里想了解下Java后台的开发 xff0c 以至于更好的配合后台工作 xff0c 下面说下破解版的安装过程 xff08 Mac xff09 第一步 xff1a 下载Java开发工具 这里我们选择比较好的
  • Mac IntelliJ IDEA连接和操作MySQL数据库

    想要IntelliJ IDEA后台开发 xff0c 数据库的连接时必不可少的 xff0c 这里我们选择开源的 xff0c 同时也是使用人数比较多的一种数据库MySQL 第一步 xff1a MySQL的下载安装 到MySQL官网下载 xff0
  • GStreamer-CRITICAL **: gst_element_make_from_uri: assertion `gst_uri_is_valid (uri)' failed

    在Qt中 xff0c 使用phonon播放视频的时候 xff0c 出现了GStreamer CRITICAL gst element make from uri assertion 96 gst uri is valid uri 39 fa
  • IDEA导入JDBC驱动的jar包

    JDBC的全称是Java Database Connectivity xff0c 意思就是Java数据库链接 xff0c 是一套面向对象的应用程序接口 xff0c 指定了统一的访问各种类型数据库的标准接口 JDBC是一种底层的API xff
  • IDEA-自带Database中table进行增删改查和筛选数据

    显式的数据库有人喜欢用Navicat Premium xff0c 在里面对数据进行各种筛选和增删改查操作 xff0c 用起来很方便 这里我们说下IDEA内部自带的显式的数据库 这里我已经建好数据库和表 xff0c 表内数据我也添加了若干条
  • Flutter - Android Studio开发Flutter以及iOS真机测试

    上一节已经配置好了iOS和安卓的环境 xff0c 下面我们用Android Studio开发Flutter xff0c 当然你也可以用VSCode和ItelliJ IDEA来开发 还没配置的同学请看上一片文章 一 创建项目 接着上一节操作
  • Oracle 中ORA-28000: the account is locked解决办法

    在没有navicat xff0c 只有cmd应用程序的条件下 xff0c 在密码输入多次都出现 the account is locked用户账号被锁的问题 xff0c 请看这里 xff1a 首先 xff0c 出现ORA 28000 the
  • Linux 虚拟机设置共享文件夹不显示问题解决办法

    安装完VMware Tools后 xff0c 不要点重新启动客户机 xff0c 需要先关闭客户机 xff0c 然后再启动客户机就可以看到共享的文件
  • ROS话题通信c++和python实现

    机器人是一种高度复杂的系统性实现 xff0c 在机器人上可能集成各种传感器 雷达 摄像头 GPS 以及运动控制实现 xff0c 为了解耦合 xff0c 在ROS中每一个功能点都是一个单独的进程 xff0c 每一个进程都是独立运行的 更确切的
  • Go微服务架构实战-中篇 1. k8s架构介绍

    Go微服务架构实战 公粽号 xff1a 堆栈future 本系列文章主要是针对云原生领域微服务架构的实战 xff0c 包括网关 xff0c k8s xff0c etcd以及grpc等相关技术的应用 xff0c 同时也会把服务发现与注册 xf

随机推荐

  • ubuntu系统备份还原(迁移)到另外一台电脑上

    ubuntu系统备份还原 迁移 到另外一台电脑上 主要参考如下博客 xff1a https blog csdn net zeg635702733 article details 53992224 https blog csdn net qq
  • 选择嵌入式行业还是互联网行业

    本人大学的时候读的是电子信息科学与技术 xff0c 从小就特别喜欢电子产品 xff0c 经常把家里的电器这些拆来玩 xff0c 录音机 复读机都拆过 xff0c 对它们有一种莫名的喜欢 在高考那年 xff0c 填志愿的时候 xff0c 有考
  • 【直达本质】超快 STM32 系统入门指南

    计算机类的教程多 xff0c 框架和 API 用法讲的全面 xff0c 成系统的教程很多 xff0c CSDN上 知乎上很多个人学习记录和全面的成书的教程 xff0c 而且生动形象有甚至有动画讲解 xff0c 回过头来看嵌入式的教程 xff
  • ubuntu20.04上安装ros及控制小乌龟移动

    目录 一 安装过程二 运行ROS1 2 rqt graph 显示系统计算图 3 rosnode 显示所有节点相关信息 4 使小乌龟做圆周运动rostopic话题控制c语言控制 三 总结 一 安装过程 参考这篇古月居的博客 xff08 非常详
  • ros+opencv的一些安装经验

    记录一些乱七八糟的过程 1 安装ROS时候一般会默认安装opencv3 3 1 xff0c 可以在 opt ros melodic include下看到opencv3 3 1的文件夹 我安装ros后又安装了opencv3 4 2 xff0c
  • 一份工作一年半的java开发个人简历,欢迎拍砖

    一份个人简历 xff0c 大四提前一年出来实习 xff0c 在12306 2020年毕业 xff0c 开始第二份正式工作 从大学毕业 xff0c 只是我学习之路的刚刚开始 简历所写的内容都是真实的 xff0c 一点水分没有 欢迎拍砖 xff
  • 让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

    最近一直有一个问题 xff0c 如鲠在喉 争取早一天解决 xff0c 早一天踏踏实实的睡觉 问题是 xff1a 在ES中 xff0c 一条JSON数据是如何写入到磁盘上的 xff1f 如何解决这个问题 xff1f 我想到了chatGPT x
  • 借助chatGPT强大的源码理解能力,来快速学习elasticsearch 7.11.1整体源码结构(用chatGPT学源码太香了)

    ES阅读学习源码的难处 es的源码非常之多 能够查阅的资料非常少 如果是我们一行一行的去扒着源码看 xff0c 在我看来至少需要2年的时间 xff0c 并且至少要耗费四分之一的头发 源码读起来很枯燥 xff0c 特别是在我们一头雾水的时候
  • ChatGPT 学习 ES & lucene 底层写入原理,源码

    一直有个疑问 学习最新版lucene 数据写入相关的源码 xff0c 应该看哪些源码 xff0c 以什么顺序看 xff08 先看什么 xff0c 后看什么 xff09 xff1f 对于Lucene的数据写入过程 xff0c 可以分为以下几个
  • 想优化ES检索,先了解底层Lucene,Lucene源码结构一览

    Lucene源码结构剖析 前言 有半年没写任何博客了 xff0c 如果不是工作中还是碰到了非常多的挑战 xff0c 我应该不会去花心思研究Lucene源码 xff0c 果然DDL和困难才是第一生产力 xff0c 没错 xff0c 我想写一篇
  • Lucene Query Parser 语法

    lucene的组合条件语法 xff0c 看了网上很多文章 xff0c 真的都太差了 还是官网清晰明了一点 SKIP NAVIGATION LINKS OVERVIEWPACKAGECLASSUSETREEDEPRECATEDHELP PRE
  • 《JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版(Doug Lea)》

    免责声明 xff1a 全部内容都属于是段友分享 xff0c 我只是属于整理 写在前边 xff0c 个人觉得 弄一个积分下载 xff0c 就是在自掘坟墓 表面上看起来是可以为个人赚积分 xff0c 实际砍掉分享交流的一个途径 对我就是没有积分
  • 《Java核心技术 卷1 基础知识 原书第10版》

    免责声明 xff1a 全部内容都属于是段友分享 xff0c 我只是属于整理 写在前边 xff0c 个人觉得 弄一个积分下载 xff0c 就是在自掘坟墓 表面上看起来是可以为个人赚积分 xff0c 实际砍掉分享交流的一个途径 对我就是没有积分
  • 《高性能mysql第三版》

    免责声明 xff1a 全部内容都属于是段友分享 xff0c 我只是属于整理 写在前边 xff0c 个人觉得 弄一个积分下载 xff0c 就是在自掘坟墓 表面上看起来是可以为个人赚积分 xff0c 实际砍掉分享交流的一个途径 对我就是没有积分
  • idea中maven报错Cannot reconnect

    问题所在 xff1a Maven工程 错误处在pom文件 xff1a 最重要的是学会了怎样在Idea出现错误时 xff0c 发现导致错误的具体原因 xff0c 通过 Helper gt Show Log in Explorer xff0c
  • 用一份JAVA工程师的求职简历来说说求职简历怎么写

    这是一篇我比较想看到的简历指导的文章 但是我比较反对简历造假 我觉得会什么写什么把 可以先看看我的这篇文章 xff1a 刚实习结束 xff0c 就要做面试官 xff0c 谈谈我的想法 自己做过面试官以后 xff0c 自己也总结了一下 xff
  • LiveGBS/LiveNVR等实现安防监控视频Web无插件直播时如何叠加水印文字

    H5直播点播播放器 下载集成入口 xff1a https www liveqing com docs download LivePlayer html 使用说明 xff1a https www liveqing com docs manua
  • OpenMV4开发笔记3-串口通信

    OpenMV4引出了串口3和串口1 xff0c 首先以串口3的收发为例 span class token keyword import span time span class token keyword from span pyb spa
  • FreeRTOS与UCOSIII任务状态对比

    FreeRTOS任务状态 1 运行态 正在运行的任务 xff0c 正在使用处理器的任务 单核处理器中任何时候都有且只有一个任务处于运行态 2 就绪态 已经准备就绪 xff08 非阻塞或挂起 xff09 xff0c 可以立即运行但还没有运行的
  • 白话TCP/IP协议栈

    前言 最近在复习总结计算机基础知识 xff0c 包括操作系统 数据结构 计算机网络等程序员必备的知识 xff0c 这属于程序员的内功 把内功修炼好了 xff0c 外功只是一种形式 xff0c 如果你内功深厚 xff0c 那么无论是用龙抓手还