TCP/IP 基础知识

我把本身以往的文章汇总成为了 Github ,欢迎各位大佬 star
https://github.com/crisxuan/bestJavaer
已提交此篇文章html

tcpipbasic001

要说咱们接触计算机网络最多的协议,那势必离不开 TCP/IP 协议了,TCP/IP 协议同时也是互联网中最为著名的协议,下面咱们就来一块儿聊一下 TCP/IP 协议。前端

TCP/IP 的历史背景

最初尚未 TCP/IP 协议的时候,也就是在 20 世纪 60 年代,许多国家和地区认识到通讯技术的重要性。美国国防部但愿可以研究一种即便通讯线路被破坏也可以经过其余路线进行通讯的技术。为了实现这种技术,出现了分组网络。git

tcpipbasic002

即便在两个节点通讯的过程当中,几个节点遭到破坏,却依然可以经过改变线路等方式达使两个节点之间进行通讯。程序员

这种分组网络促进了 ARPANET(Advanced Research Projects Agency Network) 的诞生。ARPANET 是第一个具备分布式控制的广域包分t组交换网络,也是最先实现 TCP/IP 协议的前身。github

ARPANET 实际上是由 美国国防部高级研究计划局 计划创建。面试

因此,计算机网络的出如今最一开始是由于军事研究目的。服务器

20 世纪 90 年代,IOS 开展了 OSI 这一国际标准化的进程,然而却没有取得实质性的进展,可是却使 TCP/IP 协议获得了普遍使用。网络

这种导致 TCP/IP 协议快速发展的缘由多是因为 TCP/IP 的标准化。也就是说 TCP/IP 协议中会涉及到 OSI 所没有的标准,而这种标准将是咱们接下来主要探讨的内容。架构

这里咱们先来认识一下 TCP/IP 协议,TCP/IP 协议说的不只仅只是 TCP 和 IP 这两种协议,实际上,TCP/IP 指的是协议簇,协议簇是啥呢?简单来讲就是一系列协议的综合,若是下次再问你 TCP/IP 协议有哪些的话,能够把下面这张图甩给他框架

tcpipbasic003

以上的协议汇总起来,就是 TCP/IP 协议簇。

TCP/IP 标准

TCP/IP 相较于其余协议的标准,更注重两点:开放性实用性,即标准化可否被实际使用。

开放性说的是 TCP/IP 是由 IETF 讨论制定的,而 IETF 自己就是一个容许任何人加入进行讨论的组织。

实用性说的是就拿框架来讲,若是只浮于理论,而没有落地的实践,那么永远成为不了主流。

TCP/IP 的标准协议就是咱们所熟知的 RFC 文档,固然你能够在网络上看到。RFC 不只规范了协议标准,还包含了协议的实现和使用信息。

关于更多 RFC 协议,你能够看一下官方文档 https://www.rfc-editor.org/rfc-index.html

这里咱们再也不详细展开介绍了,咱们这篇文章的重点要放在对 TCP/IP 的研究上。

TCP/IP 协议簇

下面咱们就开始聊一聊 TCP/IP 协议簇。

TCP/IP 协议是咱们程序员接触最多的协议,OSI 模型共有七层,从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。可是这显然是有些复杂的,因此在 TCP/IP 协议中,它们被简化为了四个层次

tcpipbasic004

下面咱们从通讯链路层开始介绍一下这些层以及与层之间的协议。

通讯链路层

若是非要细分的话,通讯链路层也能够分为 物理层数据链路层

物理层

物理层是 TCP/IP 的最底层是负责传输的硬件,这种硬件就至关因而以太网或电话线路等物理层的设备。

数据链路层

另一层是数据链路层,数据链路层位于物理层和网络层中间,数据链路层定义了在单个链路上如何传输数据。

网络层

网络层主要使用 IP协议,IP 协议基于 IP 地址转发分包数据。

tcpipbasic005

IP 协议的主要做用就是将分组数据包发送到目标主机

TCP/IP 分层中的互联网层与传输层的功能一般由操做系统提供。

IP 还隐含着数据链路层的功能,经过 IP 协议,相互通讯的主机之间不论通过怎样的底层数据链路,都可以实现相互通讯。

虽然 IP 也是一种分组交换协议,可是 IP 却不具有重发机制。即便数据没有到达另外一端也不会进行重发,因此 IP 属于非可靠性协议。

网络层还有一种协议就是 ICMP,由于 IP 在数据包的发送过程当中可能会出现异常,当 IP 数据包由于异常而没法到达目标地址时,须要给发送端发送一个异常通知,ICMP 的主要功能就在于此了。鉴于此状况,ICMP 也能够被用来诊断网络状况。

传输层

咱们上面刚介绍完 TCP/IP 协议最重要的 IP 协议后,下面咱们来介绍一下传输层协议,TCP 协议时传输层协议的一种。

传输层就好像高速公路同样,链接两个城市的道路。下面是互联网的逻辑通道,你能够把它想象成为高速公路。

tcpipbasic006

传输层最主要的功能就是让应用层的应用程序之间完成通讯和数据交换。在计算机内部运行着不少应用程序,每一个应用程序都对应一个端口号,咱们通常使用端口号来区分这些应用程序。

传输层的协议主要分为面向有链接的协议 TCP 和面向无链接的协议 UDP

TCP

TCP 是一种可靠的协议,它可以保证数据包的可靠性交付,TCP 可以正确处理传输过程当中的丢包、传输顺序错乱等异常状况。此外,TCP 还提供拥塞控制用于缓解网络拥堵。

UDP

UDP 是一种不可靠的协议,它没法保证数据的可靠交付,相比 TCP ,UDP 不会检查数据包是否到达、网络是否阻塞等状况,可是 UDP 的效率比较高。

UDP 经常使用于分组数据较少或者广播、多播等视频通讯和多媒体领域。

应用层

在 TCP/IP 协议簇中,将 OSI 标准模型中的会话层、表示层都归为了应用层。应用层的架构大多属于客户端/服务端模型,提供服务的程序叫作服务端、接受服务的程序叫作服务端。在这种架构中,服务端一般会提早部署到服务器上,等待客户端的链接,从而提供服务。

tcpipbasic007

数据包的发送历程

下面咱们来介绍一下一个数据包是如何通过应用层、运输层、网络层和通讯链路层把一个数据包发送给另一个数据包的。

数据包结构

咱们首先先来认识一下数据包的结构,这里 cxuan 只是给你简单介绍一下,后面的文章会更加详细的介绍。

tcpipbasic008

在上面的每一个分层中,都会对所发送的数据增长一个 首部,这个首部中包含了该层必要的信息。每一层都会对数据进行处理并在数据包中附上这一层的必要信息。下面咱们就来聊一聊数据包的发送过程。

数据包发送历程

假设主机 A 和主机 B 进行通讯,主机 A 想要向主机 B 发送一个数据包,都会经历哪些奇特的操做?

应用层的处理

主机 A 也就是用户点击了某个应用或者打开了一个聊天窗口输入了cxuan,而后点击了发送,那么这个 cxuan 就做为一个数据包遨游在了网络中,等下还没完呢,应用层还须要对这个数据包进行处理,包括字符编码、格式化等等,这一层实际上是 OSI 中表现层作的工做,只不过在 TCP/IP 协议中都归为了应用层。

数据包在发送的那一刻创建 TCP 链接,这个链接至关于通道,在这以后其余数据包也会使用通道传输数据。

传输层的处理

为了描述信息能准确的到达另外一方,咱们使用 TCP 协议来进行描述。TCP 会根据应用的指示,负责创建链接、发送数据和断开链接。

TCP 会在应用数据层的前端附加一个 TCP 首部字段,TCP 首部包含了源端口号目的端口号,这两个端口号用于代表数据包是从哪里发出的,须要发送到哪一个应用程序上;TCP 首部还包含序号,用以表示该包中数据是发送端整个数据中第几个字节的序列号;TCP 首部还包含 校验和,用于判断数据是否损坏,随后将 TCP 头部附加在数据包的首部发送给 IP。

网络层的处理

网络层主要负责处理数据包的是 IP 协议,IP 协议将 TCP 传过来的 TCP 首部和数据结合看成本身的数据,并在 TCP 首部的前端加上本身的 IP 首部。所以,IP 数据包后面会紧跟着 TCP 数据包,后面才是数据自己。IP 首部包含目的和源地址,紧随在 IP 首部的还有用来判断后面是 TCP 仍是 UDP 的信息。

IP 包生成后,会由路由控制表判断应该发送至哪一个主机,IP 修饰后的数据包继续向下发送给路由器或者网络接口的驱动程序,从而实现真正的数据传输。

若是不知道目标主机的 IP 地址,能够利用 ARP(Address Resolution Protocol) 地址解析协议进行查找。

通讯链路层的处理

经由 IP 传过来的数据包,以太网会给数据附上以太网首部并进行发送处理。以太网首部包含接收端的 MAC 地址、发送端的 MAC 地址以及标志以太网类型的以太网数据协议等。

下面是完整的处理过程和解析过程。

tcpipbasic009

如上图所示,左侧是数据的发送处理过程,应用层的数据通过层层处理后会变为能够发送的数据包,通过物理介质发送至指定主机中。

数据包的接收流程是发送流程的逆序过程,数据包的解析一样也会通过下面这几步。

通讯链路的解析

目标主机收到数据包后,首先会从以太网的首部找到 MAC 地址判断是不是发给本身的数据包,若是不是发给本身的数据包则会丢弃该数据包。

若是收到的数据包是发送给本身的,就会查找以太网类型判断是哪一种协议,若是是 IP 协议就会扔给 IP 协议进行处理,若是是 ARP 协议就会扔给 ARP 协议进行处理。若是协议类型是一种没法识别的协议,就会将该数据包直接丢弃。

网络层的解析

通过以太网处理后的数据包扔给网络层进行处理,咱们假设协议类型是 IP 协议,那么,在 IP 收到数据包后就会解析 IP 首部,判断 IP 首部中的 IP 地址是否和本身的 IP 地址匹配,若是匹配则接收数据并判断上一层协议是 TCP 仍是 UDP;若是不匹配则直接丢弃。

注意:在路由转发的过程当中,有的时候 IP 地址并非本身的,这个时候须要借助路由表协助处理。

传输层的处理

在传输层中,咱们默认使用 TCP 协议,在 TCP 处理过程当中,首先会计算一下 校验和,判断数据是否被损坏。而后检查是否按照序号接收数据,最后检查端口号,肯定具体是哪一个应用程序。

数据被完整的识别后,会传递给由端口号识别的应用程序进行处理。

应用程序的处理

接收端指定的应用程序会处理发送方传递过来的数据,经过解码等操做识别出数据的内容,而后把对应的数据存储在磁盘上,返回一个保存成功的消息给发送方,若是保存失败,则返回错误消息。

上面是一个完整的数据包收发过程,在上面的数据收发过程当中,涉及到不一样层之间的地址、端口号、协议类型等,那么咱们如今就来剖析一下。

数据包通过每层后,该层协议都会在数据包附上包首部,一个完整的包首部图以下所示

tcpipbasic010

在数据包的发送过程当中,各层以此对数据包添加了首部信息,每一个首部都包含发送端和接收端地址以及上一层的协议类型。以太网会使用 MAC 地址、IP 会使用 IP 地址、TCP/UDP 则会用端口号做为识别两端主机的地址。

此外,每一个分层中的包首部还包含一个识别位,它是用来标识上一层协议的种类信息。

总结

这一篇文章 cxuan 仍是在和你聊一些基础知识,这些基础知识是为下面文章提早预热准备的,下一篇文章咱们会聊到数据链路层的相关知识,敬请期待。

你好,我是 cxuan,一枚技术人。我一共写了六本 PDF

《Java 核心技术总结》
《HTTP 核心总结》
《程序员必知的基础知识》
《操做系统核心总结》
《Java 核心基础 2.0》
《Java 面试题总结》

如今我把百度连接给你们放出来了,你们能够点击下方的连接领取

连接: https://pan.baidu.com/s/1mYAeS9hIhdMFh2rF3FDk0A 密码: p9rs

相关文章
相关标签/搜索