TCP/IP协议栈详解
TCP/IP协议栈TCP/IP协议是规范不同主机之间进行通信的一系列协议,其中涉及到数据的封装,传输,寻址等一系列内容,是计算机领域非常重要的基础知识,我们在Java中用到的Socket通信就是基于TCP/IP协议中的TCP协议,开发为一系列封装好的API供用户使用。为什么要制定这些协议呢?这些协议为通信领域指定了唯一的标准,为不同的网络供应商,设备制造商的生产和服务提供了一个统一的标准。TCP.
TCP/IP协议栈
TCP/IP协议是规范不同主机之间进行通信的一系列协议,其中涉及到数据的封装,传输,寻址等一系列内容,是计算机领域非常重要的基础知识,我们在Java中用到的Socket通信就是基于TCP/IP协议中的TCP协议,开发为一系列封装好的API供用户使用。为什么要制定这些协议呢?这些协议为通信领域指定了唯一的标准,为不同的网络供应商,设备制造商的生产和服务提供了一个统一的标准。TCP/IP协议栈就是一个类似数据结构中的栈的模型,它有很多层,每层承担着不同的功能,有不同的协议。我们一般可以把协议栈理解为一个四层的模型:应用层、传输层、网络层、链路层。应用层中有一些面向用户的与应用相关的协议,涉及到对数据的一些分析和处理,使得用户信息和数据流之间得到转换;传输层是负责执行数据流和数据段之间的转换,是数据信息的管理层面;网络层涉及到与其他主机的联系,对数据封装并找到合适的路径把信息发出去或者接收进来;链路层中主要是一系列为了实现相应功能的接口,是协议栈的最底层。一般来说,用户信息会从应用层开始,往下逐步被包装,当传到另一个主机的时候,再从下到上一步步打开包装,最终解析还原为用户信息。在这个过程中,各项协议确保了传输过程的实现以及数据的安全。
TCP/IP协议栈:
协议栈之应用层
应用层包括的协议有:
1、文件传输类:HTTP(超文本传输协议)、FTP(文件传输协议)、TFTP(简单文件传输协议)
2、远程登录类:Telnet
3、电子邮件类:SMTP(简单邮件传输协议)
4、网络管理类:SNMP(简单网络管理协议)
5、域名解析类:DNS
接下来我们逐一介绍这些协议:
①HTTP协议:这是一种超文本链接协议,适用于分布式超媒体系统,它对应的客户端的连接对象是web服务器,也就是我们常见的“www”,我们在登录一个网页的时候必然需要经过这个协议,它是我们在网页设计以及网页数据的传输中的规范。
②FTP协议:这是一种文件传输协议,它是基于TCP协议(TCP协议位于传输层,我们之后会提到)实现的一种应用层的协议,使得用户可以在FTF服务器上下载大信息量的文件,FTP协议保障了文件的传输的可靠性。
③TFTP协议:简单文件传输协议,TFTP只能获得和写入文件,和前者不同之处是这种协议是基于UDP协议的,这是不是一种面向连接的协议。什么是面向连接呢?面向连接就是协议的目的是保障通信双方能够保持连接并进行数据的交互。而TFTP协议是一种无连接协议,发文件方只管文件发出去了而不会管对方是不是受到了文件。QQ传输文件使用的就是TFTP协议,那么既然它不可靠,为什么还要使用它呢?因为这种文件传输方式成本低,在小文件的传输中可以提高速度而不需要复杂的来回确认和验证,我们要想保障文件的传输,只要在应用层对UDP传输的数据做一些处理,依然能达到可靠传输的效果。
④Telnet协议:远程登录类协议,客户端需要通过这个协议去登录到服务器上。这里我们可以举个简单的例子来说明:主机1提出申请希望登录到某主机2的服务器上,这时TCP会为它分配一个源端口号(假设是1288),然后指定登录类的目标端口号为23(登录类的端口号在计算机上是确定且唯一的,这可以让主机2知道这个消息发给登录类的),当数据到达主机2的时候,如果23号端口的服务器是开启的,客户端便可以连接到服务器,主机2会生成一个远程端口1288号,如果主机1上的第二个Telnet用户向TCP提出登录申请,这时TCP会为它分配另一个(如1289)的端口号去和服务器连接。关于端口号的使用,小于255一般是公共应用,255 ~1023是特定应用商的特定端口号,我们一般使用大于1023的端口号。
⑤STMP协议:简单邮件传输协议,这也是基于UDP的一项应用,其实现类似于简单文件传输协议但这项协议是针对邮件的传输的。
⑥SNMP协议:简单网络管理协议,它的作用是管理员可以通过网络对那些位于不同物理空间的主机进行配置和管理。
⑦DNS协议:这是一系列关于网站域名和IP地址的映射,IP地址是由一系列数字组成,不便于记忆,而映射为域名去访问就会容易很多,在DNS中,这种映射也是唯一的。
协议栈之传输层
传输层我们的协议是TCP协议和UDP协议,这两个协议在整个TCP/IP协议栈中十分重要,下面我们来详细介绍这两种协议的特点和区别:
①TCP协议(传输控制协议):
- TCP协议是一种面向连接的可靠的协议,它会确保数据可以安全的从一方传输到另一方,TCP的可靠性是如何实现的呢?
- 三次握手:基于TCP的通信在数据传输前需要先进行三次握手,然后建立连接,开始数据的传输,在传输结束的时候,会执行改进的三次握手实现断开连接,由此可以看出这个过程的可靠性。在传输层,主机之间的通信是端到端的,两主机之间相互发送数据。
- 三次握手:主机1发送自己的序列号SYN:X给主机2,主机2收到后会发一个应答号ACK:X+1给主机1,同时会把自己的序列号SYN:Y也发给主机1,主机1收到后,会发应答号ACK:Y+1及序列号SYN:X+1给主机2,这样三次握手就完成了,两主机就可以进行通信。
- 三次握手图示:
- 在通信结束时,两主机执行改进的三次握手来实现通信的结束。主机1先发一个FIN报文段包给主机2,主机2收到后先发一个应答号ACK,然后开始关闭相关应用,待主机2的程序告诉主机,要彻底关闭应用时,主机2向主机1发送FIN报文段给主机1,主机1收到后发一个应答号ACK给主机2,表示彻底关闭了连接,结束了通信。在这个过程我们可以发现,三次握手使得双方可以可靠地实现对话,但这如果在小信息量的通信中,似乎效率有些低。
- 改进的三次握手图示(四次挥手):
- 超时与重传:如果发送方在一定时间内没有接受到发送的数据段的应答,就会重新发送此数据段,直到接受到该数据段的应答后就会释放该数据段的缓存。另外,如果在数据段传输的过程中发生了网络堵塞,发送方迟迟没有收到应答,就会重传数据段,网络恢复后原先的数据段就会继续发送到接收方,这时接收方收到了两个相同的数据段,但它只会获取第一个接收到的数据包而丢弃第二个,这增加了TCP数据传输的可靠性。
- 窗口技术:窗口是限制同时接收的最大数据量,如果发送方一次性发出的数据段数量大于它的窗口限制,就会只接收最大限额的数据段而把剩下的数据段返还给发送方,并告诉发送方下次最大的同时发送的数据段数量,返还的数据段会在下一次发送的时候再次发出。窗口技术对数据的传输量提出了要求,可以防止网络的堵塞。
- 面向流:当发送方和接收方之间传输大量数据的时候,发送方的TCP会把数据流分段分组发送,接收方再根据分段上的信息对其重新整合还原。
- 多路复用技术:由端口号来实现。
- 全双工:在一条连接上可以同时传输两条相反的数据流。
- TCP数据域头格式:
②UDP协议(用户数据包协议): - UDP协议是一种无连接的不可靠的协议,也被称为一种轻权通信。如果说TCP是协议实现的是两个人的电话的交流,UDP实现的给另一个发一封信,我只管把东西发出去,而不用管对方有没有收到。因此这是一种不可靠的协议,在数据的传输中是可能出现丢包的情况的,但它依然应用广泛,因为它传输数据很方便,消耗的资源很少,我们需要用应用层协议来确保数据的可靠性,可能实现比TCP更优的效果。
- 使用UDP的协议包括:TFTP、SNMP、NFS(网络文件系统)、DNS、DHCP(动态主机配置)等。
- UDP数据域头格式:
协议栈之网络层
网络层包括的协议有:IP、ICMP、ARP、RARP、DHCP等。
①IP(网际协议):
- IP协议是我们最常见的一种通信协议,它为每一台主机赋予了身份,使得不同主机之间可以通过IP进行访问,IP地址有32位和48位两种,32位的是IPv4,目前这种IP将要被分配完,之后将逐渐过渡到IPv6,更长的位数意味着可以分配更多不同的IP。IP地址是网络供应商为其网络中的用户分配的一系列地址,IPv4有A、B、C、D、E五类,IP地址的高位一般是网络地址,低位是主机地址,不同的类别决定了其网络地址的长度,比如A类的高八位是网络地址,B类的高16位是网络地址。
- IP地址分类图:
- 这里我们介绍一下什么是网络地址,什么是主机地址:我们知道,在不同主机之间除了有传输数据的线路,还有分配数据的路由器,路由器的作用就是通过其自身的网络地址和接口的映射来决定把数据传输给谁。一般来说我们通过链路层发出的数据包括以下这些信息:目标IP地址,源IP地址,目标MAC(介质访问地址,此地址由设备的制造商赋予,全球唯一)地址,自身MAC地址,数据,到达路由器后它会选择一个合适的通道把数据传送到下一个网络地址,数据会从一个路由器跳到另外一个路由器(逐跳的方式),当数据从最后一个路由器发出后,通过ARP就可以把数据送到目标主机,ARP寻址用到的就是主机地址。IP地址是网络地址和主机地址统一,我们区分他们的方法就是通过子网掩码,子网掩码是高位全为1,低位全为0的和IP等长的数据区域,把子网掩码和IP地址相与就可以得到高位的IP网络地址。
- 如果我们一个网络中只有少数几台主机,这就意味着我们只需要很少的几种主机地址就可以区分这些主机,那么我们的思路是把子网掩码的更多的位赋1,使得高位有更多位数来分配更多的子网络,这是一种充分利用位数的思路。
- 子网规划示意图:
- IP地址的特殊情况。全为0,一般缺省情况是不支持这种情况的。
- 公有地址和私有地址。为了节省地址的数量,我们把地址分为公有地址和私有地址,公有地址是对外的且其地址唯一,私有地址是对内的,在内部使用的时候用的是私有地址,我们用公有地址来接收数据,转为私有地址再使用,我们要把信息发出去时要先转化为公有地址再发出去。
- VLSM是一种可变长度子网掩码的协议,使得地址空间的分配更加灵活,得到优化。
②ICMP协议(控制消息协议):它主要用在对信息的发送的判断处理上。 - 查询报文。比如在cmd中的Ping指令,它可以去尝试连接某个网,如果能够寻找到就会有返回信息;在Ping自身IP时,指令经过一个回路会回到原处,此时不需要网络。
- 错误报文。错误报文可能出现在信息传输的不同环节上,分为几种不可达。网络不可达:主机1把信息发到路由器上之后,发现这个路由器上没有到达指定位置的网络地址的映射,会返回一个网络不可到达的指令;主机不可到达:在网络可达的情况下,如果在与主机2连接的路由器发出信息后,服务器down机了,便会返回主机不可达到;禁止分割:当数据的大小超过数据包最大传输单元(MTU)时,我们需要把数据包分割为两个较小的单位才可以通过路由器,但如果路由器禁止分割,数据包就无法通过,便会返回禁止分割;当数据包到达主机2但是主机2上没有TCP/IP协议(这种情况一般不会发生),会返回协议不可达;端口不可达:即使数据包通过了最后一步,连接上了服务器,但相关端口的软件没有开,那么数据仍然无法达到,此时返回端口不可达。
- ICMP超时:每个数据包在发出后会在数据段标识TTL这个值,初值大于0,每经过一个路由器就会减1,一旦减到0,这个数据包就会被丢弃,返回ICMP超时,丢弃这个数据包,这样可以防止数据包在两个路由器之间不断回传。
- ICMP重定向:当主机1向主机2发送数据时,默认网关是发给路由器B,路由器B发现下一跳是发给路由器A,而路由器A的接口和之前的数据包接收的接口是同一个,那么它会向主机发送一个ICMP重定向报文,告诉它以后把数据发给路由器A,这就是重定向。
- ICMP重定向图示:
- 在Ping指令中,ICMP还可以实现计算数据的往返时间,用接收到数据包的时间减去发送数据包的时间就可得到往返时间。
③ARP协议(地址解析协议):这也是一种映射,它是映射在主机中的,它存储的信息是IP地址到MAC的映射。IP和MAC的区别就是IP是由网络服务供应商分配提供的地址,IP在大的范围内是可能重复的,MAC是由计算机的制造商生产的时候赋予计算机的全球唯一的标识。假设主机1和主机2在同一个网络中,主机1有主机2的IP但不知道它的MAC地址,这时候数据是无法送达主机2的,这时需要用到广播的形式。以太网中,主机之间都有一条公用的总线,主机1发送消息给总线,所有网络内的主机都能收到,他们会匹配目的IP地址,如果匹配上就会应答,向主机发送自己的IP和MAC,同时把主机的IP和MAC映射到自己的ARP中,便于下次发消息,其他主机虽然不会去应答,但也会把主机1的信息映射到自己的ARP中。
④RARP协议(反向地址解析协议):和ARP的区别的这类协议的主机自身无磁盘空间,它的信息都存放在别的服务器中,在发送信息前需要回去需要的数据,比如它已知自己的MAC,需要获取自己的IP,发出广播后,其授权服务器接收到信息后就会产生应答,把它的IP地址返回。
⑤DHCP协议(动态主机配置协议):它的作用是使得主机的配置可以在服务器中完成,通过服务器去配置其他主机的IP,子网掩码,默认网关等参数。这使得维护修改IP数据的成本大大降低了。
协议栈之链路层
链路层是各类数据传输的物理接口,这里就不详细展开了。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)