TCP是如何传输数据的?

这篇具有很好参考价值的文章主要介绍了TCP是如何传输数据的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

做IT相关的工作,肯定都离不开网络,网络中最重要的协议是TCP。无论是实际工作还是笔试面试,你看哪里能少得了TCP?我考过RFC中与TCP相关的文档,也看过Linux中与TCP相关的源码,也看过不少框架中的TCP相关的代码,对TCP是有点感觉了。

一直想找个时间来分享下TCP相关的知识,如果大家有疑问,欢迎相互交流。其实,搞透了TCP之后,发现他也就是那么回事。

考虑最简单的情况:两台主机之间的通信。这个时候只需要一条网线把两者连起来,规定好彼此的硬件接口,如都用USB、电压10V、频率2.4GHz等,这一层就是物理层,这些规定是物理层协议。

TCP是如何传输数据的?

 我们当然不满足于只有两台电脑连接,因此我们可以使用交换机把多个电脑连接起来,如下图:

TCP是如何传输数据的?

 这样连接起来的网络,称为局域网,也可以称为以太网(以太网是局域网的一种)。在这个网络中,我们需要标识每个机器,这要才可以指定要和哪个机器通信。这个标识就是硬件地址MAC。硬件地址随机器的生产就被确定,永久性唯一。在局域网中,我们需要和另外的机器通信时,只需要只知道他的硬件地址,交换机就会把我们的消息发送到对应的机器。

这里我们可以不管底层的网线接口如何发送,把物理层抽离,在他之上创建一个新的层次,这就是数据链路层。

我们依然不满足与局域网的规模,需要把所有的局域网联系起来,这个时候就需要用到路由器来连接两个局域网:

TCP是如何传输数据的?

 但是如果我们还是使用硬件地址来作为通信对象的唯一标识,那么当网络规模越来越大,需要记住所有的机器的硬件地址是不现实;同时,一个网络对象可能会频繁更换设备,这个时候硬件地址表维护更加复杂。这里使用了一个新的地址来标记一个网络对象:IP地址。

通过一个简单的寄信例子来理解IP地址。

我住在北京市,我朋友A住在上海市,我要给朋友A写信:

        写完信,我会在信上写好朋友A的地址,并放到北京邮局(给信息附加目标IP地址,并发给路由器)

        邮局会帮我把信运输到上海市当地邮局(信息会经过路由器传递到目标IP局域网的路由器)

        上海市当地路由器会帮我把信交给朋友A(局域网内通信)

因此,这里IP地址就是一个网络接入地址(朋友A的住址),我只需要知道目标IP地址,路由器就可以把消息给我带到。在局域网中,就可以动态维护一个MAC地址与IP地址的映射关系,根据目的IP地址就可以寻找到机器的MAC地址进行发送。

这样我们不需管理底层如何去选择机器,我们只需要知道IP地址,就可以和我们的目标进行通信。这一层就是网络层。网络层的核心作用就是提供主机之间的逻辑通信。这样,在网络中的所有主机,在逻辑上都连接起来了,上层只需要提供目标IP地址和数据,网络层就可以把消息发送到对应的主机。

一个主机有多个进程,进程之间进行不同的网络通信,如边和朋友开黑边和女朋友聊微信。我的手机同时和两个不同机器进行通信。那么当我的手机收到数据时,如何区分是微信的数据,还是王者的数据?那么就必须在网络层之上再添加一层:运输层 

TCP是如何传输数据的?

 运输层通过socket(套接字),将网络信息进行进一步的拆分,不同的应用进程可以独立进行网络请求,互不干扰。这就是运输层的最本质特点:提供进程之间的逻辑通信。这里的进程可以是主机之间,也可以是同个主机,所以在android中,socket通信也是进程通信的一种方式。

现在不同的机器上的应用进程之间可以独立通信了,那么我们就可以在计算机网络上开发出形形式式的应用:如web网页的http,文件传输ftp等等。这一层称为应用层。

应用层还可以进一步拆分出表示层、会话层,但他们的本质特点都没有改变:完成具体的业务需求 。和下面的四层相比,他们并不是必须的,可以归属到应用层中。

最后对计网分层进行小结:

TCP是如何传输数据的?

 

  1. 最底层物理层,负责两个机器之间通过硬件的直接通信;

  2. 数据链路层使用硬件地址在局域网中进行寻址,实现局域网通信;

  3. 网络层通过抽象IP地址实现主机之间的逻辑通信;

  4. 运输层在网络层的基础上,对数据进行拆分,实现应用进程的独立网络通信;

  5. 应用层在运输层的基础上,根据具体的需求开发形形式式的功能。

这里需要注意的是,分层并不是在物理上的分层,而是逻辑上的分层。通过对底层逻辑的封装,使得上层的开发可以直接依赖底层的功能而无需理会具体的实现,简便了开发。

这种分层的思路,也就是责任链设计模式,通过层层封装,把不同的职责独立起来,更加方便开发、维护等等。Http中的拦截器设计模式,也是这种责任链模式。

本文主要是讲解TCP,需要增加一些运输层的知识。可以关注我,下一篇讲解运输层的进程通信

还有底层socket的实现。文章来源地址https://www.toymoban.com/news/detail-483068.html

到了这里,关于TCP是如何传输数据的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 生活中离不开无线电,了解无线电管理常识

    一、无线电设备管理规定摘要 为维护空中电波秩序,防止有害干扰,确保无线电频率资源的有效利用保障用户合法权益,严厉打击走私活动,国家信息产业部无线电管理局信部无〔1999〕363号文《关于加强无线电发射设备管理的通告》中对如何加强无线电设备管理作出如下规

    2024年02月05日
    浏览(53)
  • 37_MFC自绘UI你离不开GDI绘图

    GDI (Graphics Device Interface)是图形设备接口的英文缩写,处理Windows程序的图形和图像输出。程序员不需要关心硬件设备及设备驱动,就可以将应用程序的输出转换为硬件设备上的输出,实现应用程序与硬件设备的隔离,大大简化程序开发工作。在Windows操作系统中,图形界面应用

    2024年02月21日
    浏览(42)
  • 【人人都离不开的算法】为年后的春招加把劲吧

    马上又到了春招的季节,你需要问下你自己,算法那一关,你过了吗? 2022年TIOBE年度编程语言排行榜的结果出来了,Python稳居榜首,C++终于超越了Java,上升到第三位。 在之前的几年中,这个榜单的排名也都不尽相同。 前几年Java是比较火的,但最近两年随着人工智能(AI)的

    2024年01月21日
    浏览(45)
  • 有哪些工具软件是一旦用了就离不开的

    在现代社会中,工具软件已经成为我们日常工作和生活的必备品。这些软件通过提供各种功能和服务,帮助我们提高效率、简化工作流程,并且在许多方面大大改变了我们的生活方式。本文将介绍一些在使用过程中让人离不开的工具软件,这些软件不仅满足了我们的各种需求

    2024年02月06日
    浏览(44)
  • VR/AR/XR背后的逻辑?离不开三维引擎相机

    作者:木一 自从Apple Vision Pro问世以来,这款被誉为开启“ 空间计算时代 ”的产品迅速吸引了众多科技博主的深度关注。业界对它的评价褒贬不一,一些人认为它是一款具有里程碑意义的创新产品,而另一些人则认为它不过是众多高质量虚拟现实(VR)产品中的一员。尽管市

    2024年04月12日
    浏览(52)
  • 嗯?大火的ChatGPT和new bing都离不开它?

    概述:本文是对 WhalePaper 向量检索领域第一次直播活动内容的文字版,会对向量检索这个 ChatGPT 和 new bing 都离不开的技术进行介绍,结合了 ChatGPT 以及 new bing 的应用场景进行讲解,相信被标题骗进来的你还真能有所收获的(手动狗头)!本期内容入门友好,对课件进行了一

    2024年02月03日
    浏览(49)
  • 测试了Copilot辅助编程后,就离不开这个AI工具了

    微软用·chatGPT 4· 对·github copilot X·升级后,本是怀着赠热点的心态测试了一下其功能。但 Copilot 智能化程度之高,令我吃惊,两周下来已离开不这个工具了。 下面简单分享一下其使用过程,以及对如何使用好这个工具的个人看法. IDE开发环境我使用的是 VSCode 与 Visual Studio2

    2024年02月06日
    浏览(49)
  • idea热部署插件JRebel激活(强烈推荐,试试就离不开了)

    JRebel可以实现在idea中热部署项目,修改后不用重启项目,让开发更丝滑。 JRebel需要激活才可以正常使用。 博主最近在找工作,Java前后端全站工程师一枚,有合适的请帮博主推荐一下 有项目的也可以联系我,感谢感谢 博主在北京 2023-07-04 发 V:y393016244 FileSettingsPlugins 搜索

    2024年02月13日
    浏览(46)
  • 什么是栈,为什么函数式编程语言都离不开栈?

    ​ 栈是一种具有特殊访问方式的存储空间,它的特殊性在于, 最后进入这个空间的数据,最先出去 ,可以画图来描述一下这种操作方式。 假设有一个盒子和三本书,依次将三本书他们放入盒子中。 入栈模拟图 ​ 现在有一个问题,如果一次只能取一本,我们如何将书从盒子

    2024年02月06日
    浏览(70)
  • 效率与性能并存——离不开 Visual Studio Code 的前端开发与我

    许久不见的软文来啦,今天久违的参与讨论一下这个话题,以此写一篇博客来发表一些我的看法和想法。话题的内容是: 有哪些工具软件是一旦用了就离不开的? 。作为一名前端开发的博主,这次的内容当然也是关于前端的,接触前端也快两年了,有这么一个编译器(工具

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包