JAVA不知道
首发于JAVA不知道

TCP/IP协议是什么?我们10分钟搞定

零·编程的我们为什么要了解TCP/IP?

我们来想想,我们编写的程序大致可以分为几种?为了我们的生活方便,我们运用编程将我们的工作效率大大提高,这是一种工具性的程序。好了,可是我们的程序不是拿来自己用用就可以了,我想每一个具有互联网和编程思想的人都希望自己的作品可以被大家看见,我们就要将我们的程序分享。也就是说我们的程序的走向大概会归到互联网这条大河里面。所以了解互联网的传输方式和规则,也成了我们这类人的生活技能和硬性需求。当然,如果你的编程产品正好是社交通信方面的,那么TCP/IP协议你就不能是了解这么简单了。

一·什么是TCP/IP

所谓协议(protocol),其实就是一个群体之间规定的规则,这个规则的目的是为了保证这个群体里面的人可以正常交流。还是回到计算机和网络的通信这边来举例。比如: 如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。

协议中存在各式各样的内容。从电缆的规格到 IP 地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及 Web 页面显示需要处理的步骤,等等。

像这样把与互联网相关联的协议集合起来总称为 TCP/IP。也有说法认为,TCP/IP 是指 TCP 和 IP 这两种协议。还有一种说法认为,TCP/IP 是在 IP 协议的通信过程中,使用到的协议族的统称。


二· 为什么不能只有一个协议?

当我们知道TCP/IP是一个协议群的时候,我想有些人会有这样一个疑问。为什么要有这么多的协议?如果是关于通信的话,为什么我们不能用一个比较全的协议,这样不是更简单?

对于这个问题我想说:多不等于复杂,少不等于简单。有时候可能恰恰相反。

对于上面那句话的解释和对“为什么不能只有一个协议? ”问题的回答我想分两个方面回答:

(一)

对于通信,我们的客观世界本身是有所区分的。举个例子,我们要将信息发给其他人,对于我们来说,就是我们电脑的消息转移到其他人的电脑上,至于怎么完成这件事的放大,我们一概不知。可是有一点我们是可以明白的。就是,我们电脑里的东西不可能如隔空取物一般的到人家的电脑里,肯定是根据什么什么东西传输过去的。

其实,通过为了达成我们所描绘的文件传输,其实需要线缆、无线信号和每个电脑是具有的唯一的地址等条件。我们看这些条件,就发现了这里面有很多东西是属于不同类别的,有的是物体,比如线缆,有的是无线的,比如无线电。如果我们以这个思路将我们的协议分为几个层面,让每个层面有专门的协议去负责,那么我们既可以做到详细和完整,我们还可减轻工作量,如我们要修改协议,我们不需要将所以的协议都改,只需要修改我们需要的部分就好了。

(二)

第二个原因更加直白:没有人能够全面掌握互联网中的传输状况

在到达通信目标前的中转过程中,那些计算机和路由器等网络设备只能获悉很粗略的传输路线。

这种机制称为路由选择(routing),有点像快递公司的送货过程。想要寄快递的人,只要将自己的货物送到集散中心,就可以知道快递公司是否肯收件发货,该快递公司的集散中心检查货物的送达地址,明确下站该送往哪个区域的集散中心。接着,那个区域的集散中心自会判断是否能送到对方的家中。我们是想通过这个比喻说明,无论哪台计算机、哪台网络设备,它们都无法全面掌握互联网中的细节。

就是因为没有人能知道互联网的信息传输的所有细节,那么我们就无法只用一个协议去将它的一切都包括起来。我们将协议根据一个思路进行分组和切割,让负责这一块的人来了解这一块的协议,这种分工协作更专业也更加科学。

三.TCP/IP的分层

对于,协议分层,TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。


TCP/IP 协议族各层的作用如下。

应用层

应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(FileTransfer
Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。HTTP 协议也处于该层。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission ControlProtocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

网络层(又名网络互连层)

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

链路层(又名数据链路层,网络接口层)

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

四·了解主要的一些协议

(一).IP协议

按层次分,IP(Internet Protocol)网际协议位于网络层。InternetProtocol
这个名称可能听起来有点夸张,但事实正是如此,因为几乎所有使用网络的系统都会用到 IP 协议。TCP/IP 协议族中的 IP
指的就是网际协议,协议名称中占据了一半位置,其重要性可见一斑。可能有人会把“IP”和“IP 地址”搞混,“IP”其实是一种协议的名称。

IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC地址(Media Access Control Address)。

IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定

地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换,但 MAC地址基本上不会更改。

使用 ARP 协议凭借 MAC 地址进行通信

IP 间的通信依赖 MAC
地址。在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的
MAC地址来搜索下一个中转目标。这时,会采用 ARP 协议(AddressResolution Protocol)。ARP
是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。


(二)·TCP协议

按层次分,TCP 位于传输层,提供可靠的字节流服务。

所谓的字节流服务(Byte Stream
Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP
协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。

确保数据能到达目标

为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略。用 TCP
协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。21握手过程中使用了 TCP 的标志(flag) ——
SYN(synchronize) 和ACK(acknowledgement)。

发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。

若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。

注意的是:除了上述三次握手,TCP 协议还有其他各种手段来保证通信的可靠

性。


(三)·DNS协议

DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。

计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。比如badidu.com

用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。

但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。

为了解决上述的问题,DNS 服务应运而生。DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。

五·协议之间的关系


六·未完

我们知道了一些简单的协议和协议的用法之后。我们发现,协议的存在解释规则的存在,并且这个规则是无比繁杂。也就是说,当我们知道了协议之后,当我们真实的需要运用协议来达到我们的目的的时候,我们要运用到它真实的内核和内容,所以学习还没有结束。

未完……..

PS:文章中的配图均来自《图解HTTP》

编辑于 2017-09-27

文章被以下专栏收录