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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

还有底层socket的实现。

TCP是如何传输数据的?相关推荐

  1. DNS同时占用UDP和TCP端口53——传输数据超过512时候用tcp,DNS服务器可以配置仅支持UDP查询包...

    DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况下使用这两种协议. 先简单介绍下TCP与UDP. ...

  2. 通过TCP调试助手传输数据时的注意事项

    --------------------------------------------- -- 时间:2019-01-09 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  3. 网络协议OSI、TCP/IP协议、Socket套接字和第三方AsyncSock的使用等解析

    一.网络协议定义 1.OSI参考模型:全称(Open System Interconnection), 开放式系统互联参考模型.是一个逻辑上的定义,一个规范,它把网络协议从逻辑上分为七层,只要目的是为 ...

  4. 万字长文,一文搞懂TCP/IP和HTTP、HTTPS

    来自:非科班的科班 TCP/IP概念 TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现 ...

  5. TCP三次握手,四次分手

    1.什么是HTTP连接 http是建立在TCP协议之上的一种应用. 最显著的特点是每次请求,都需要服务器响应,请求结束后,会主动释放连接. 1)在HTTP 1.0中,客户端的每次请求都要建立一次单独的 ...

  6. 网络攻城狮怎么看待TCP/IP协议与UDP协议?

    在互联网中,存在着各种不同层次的协议,它们分别的功能也是不同的.但做为网络攻城狮,对这些协议的使用以及区分是工作的必备技能.那今天以网络攻城狮的角度来告诉大家攻城狮是怎么看待TCP/IP协议与UDP协 ...

  7. TCP/IP、SOCKET、HTTP之间的联系与区别

    主要内容: 1.网络的七层协议 2.TCP/IP.SOCKET.HTTP简介 3.TCP连接.HTTP连接.Socket连接的区别 一.网络的七层协议 网络七层由下往上分别为物理层.数据链路层.网络层 ...

  8. 三十天学不会TCP,UDP/IP网络编程 - RST的用法

    不知不觉也写了这么多了,继续我的自己的推广大业~完整版可以去gitbook(https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/)看到. 如果对和程序员有 ...

  9. http、TCP/IP协议与socket之间的区别

    网络由下往上分为:  www.2cto.com   物理层--                       数据链路层-- 网络层--                       IP协议 传输层-- ...

最新文章

  1. Linux网络编程基础_6_应用层(下)--E-mail,WWW(大结局)
  2. 利用系统滴答时间计算实际程序运行时间
  3. Webstrom 卡顿问题
  4. 使用子查询进行编号重排的处理示例.sql
  5. TStringList 的Sorted属性
  6. java的main是主线程吗_main函数是主线程吗
  7. [dotnet]以最小的成本,落地微服务特色的DevOps管道,持续集成/部署到kubernetes。...
  8. 主管好当:一不指点工作,二不检查工作,三不改正错误
  9. FPGA 按键控制数码管
  10. ER图(实体联系图)
  11. 数值分析课程主要学习内容总结
  12. webview造成窗体泄漏
  13. 世界名画陈列馆(最少机器人问题和不重复监视问题)
  14. MongoDB可视化工具 Studio 3T
  15. JDK 8 JVM性能优化
  16. PAT甲级1009 Product of Polynomials (25分)
  17. 新冠疫情反复期间,物联网技术可以如何应用
  18. C++ 神奇的头文件
  19. 使用python玩跳一跳超详细使用教程/脚本辅助工具
  20. 黑马头条----首页和登录模块

热门文章

  1. 用CreateToolhelp32Snapshot、Process32First、Process32Next枚举进程(BCB)
  2. 量化择时之移动平均线初探
  3. 【10大基础算法】广度优先搜索-NO7
  4. 一个用interproscan做基因注释的简易教程
  5. 50道web前端工程师面试题及答案解析,你学会了吗
  6. PC端微信dat图片怎么查看?这里有神器
  7. 网络流量分析 NetFlow是什么 详解 科普 ~互联网业务流量监测技术的应用和设计---perfect
  8. ————《metasploit 魔鬼训练营》学习笔记序言
  9. USART串口协议和USART串口外设(USART串口发送串口发送和接收)
  10. 【更新】Kendo UI for jQuery发布R2 2018|附下载