浅析TCP/IP协议

一、基础知识

1、七层模型

OSI七层模型是一个参考模型,它将通信协议中必要的功能分成了7层,通过这些分层,使得那些比较复杂的网络协议更加简单化。在这一模型中,每个分层都接收由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务。上下层之间进行交互时所遵守的约定叫做“接口”,同一层之间的交互所遵循的约定叫做“协议”。七层模型如下图所示:
这里写图片描述
分层的优点:构造了一个可扩展性和灵活性都较强的系统。此外,通过分层能够细分通信功能,更易于单独实现每个分层的协议,并界定各个分层的具体责任和义务。
分层的缺点:过分模块化,使处理变得更加沉重以及每个模块都不得不实现相似的处理逻辑等问题。

2、传输方式

通过网络发送数据,大致可以分为面向连接和面向无连接两种类型:

(1)面向连接。面向连接在发送数据之前,需要在收发主机之间连接一条通信线路。就好比我们在打电话的时候,需要对方接通了才可以进行对话。因此在面向连接的方式下,必须在通信传输前后,专门进行建立和断开连接的处理。如果与对端之间无法通信,就可以避免发送无谓的数据。

(2)面向无连接。面向无连接不要求建立和断开连接,发送端可于任何时候自由发送数据,而接收端不一定接收得到数据。就好比你抛了个漂流瓶,有人捡到就捡到了,没人捡到漂去哪里也不管了。因此,在面向无连接中不需要确认对端是否存在,即使接收端不存在或无法接收数据,发送端也可以将数据发送出去。

3、TCP/IP分层模型

这里写图片描述
前面看到了OSI参考模型中各个分层的作用,但在实际中,并不是分层七层,而是把会话层、表示层、应用层合成了一层,如上图。(当然也有分层四层的,不过这里就以五层模型来进行介绍。)

二、数据链路层

TCP/IP中对OSI参考模型的数据链路层及物理层未作定义,因此TCP/IP以这两层的功能是透明的为前提。但是,数据链路的知识对于理解TCP/IP于网络起着一定的重要作用,这里就粗略补充一下。

(1)MAC地址。MAC地址用于识别数据链路中互连的节点,任何一个网卡的MAC地址都是唯一的。

(2)半双工和全双工通信。半双工是指只发送或只接收的通信方式,类似无线电收发器。全双工允许在同一时间既可以发送数据也可以接收数据,类似电话。

(3)共享介质型网络和非共享介质型网络。共享介质型网络指由多个设备共享一个通信介质的一种网络,在这种方式下,设备之间使用同一个载波信道进行发送和接收,为此,基本上采用半双工通信方式,并且有必要对介质进行访问控制。非共享介质型网络是对介质采取专用的一种传输控制方式,在这种方式下,网络中的每个站直连交换机,由交换机负责转发数据帧,在这种方式下,发送端与接收端不共享通信介质,因此很多情况下采用全双工通信方式。

(4)环路检测技术。通过网桥连接网络时,网络的拓扑结构出现了环路,在最坏的情况下,数据帧会在环路中持续被转发,越积越多的数据帧最终导致网络瘫痪。为此,为了解决网络中的环路问题,可以采用生成树源路由两种方法。

三、网络层

1、IP协议

(1)IPv4数据报

IP面向无连接。即在发包之前,不需要建立与对端目标地址之间的连接,没有提供一种数据未传达以后的处理机制,这样做是为了简化协议和提高处理速度。IPv4格式如下:

这里写图片描述
首部长度。首部长度由4比特构成,表明IP首部的大小,白色部分即为IP首部。当没有可选项时,IP首部的长度为4*5=20字节。
标识。由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。即使标识相同,如果目标地址、源地址或协议不同的话,也被认为是不同的分片。
标志。由3比特构成,表示包被分片的相关信息。第一位未使用,目前必须为0;第二位表示是否进行分片,0-是,1-否;第三位表示包被分片的情况下,是否为最后一个包,0-是,1-否。
生存时间。由8比特构成,它在实际中表示可以中转多少个路由器,每经过一个路由器,值就会减少1,直到变成0则丢弃该包。从这里就可以看出IP协议是不可靠的,它不保证一定送达。
首部校验和。该字段只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。

(2)IP报文的分片与重组

分片往往在网络上遇到比较大的报文,文法一下子发送出去时才会进行处理。例如现在有一个4300字节的IP数据报,由于以太网默认MTU(最大传输单元)是1500字节,因此这个IP数据报无法在一个帧当中发送完成,这时路由器将此IP数据报划分成了3个分片进行发送。经过分片后的IP数据报在被重组的时候,只能由目标主机进行,路由器虽然做分片但不会进行重组。

(3)IP地址的分类和子网掩码

IP地址分为四个级别,分别为A类、B类、C类、D类,如下:

这里写图片描述
A类地址是以“0”开头的地址,从第1位到第8位是它的网络标识,用十进制表示的话就是0.0.0.0~127.0.0.0。A类地址的后24位是主机标识,因此一个网段内可以容纳的主机数上限为16,777,214个。
B类地址是以“10”开头的地址,从第1位到第16位是它的网络标识,用十进制表示的话就是128.0.0.0~191.255.0.0。B类地址的后16位是主机标识,因此一个网段内可以容纳的主机数上限为65,534个。
C类地址是以“110”开头的地址,从第1位到第24位是它的网络标识,用十进制表示的话就是192.0.0.0~223.255.255.0。C类地址的后8位是主机标识,因此一个网段内可以容纳的主机数上限为254个。
D类地址是以“1110”开头的地址,从第1位到第32位是它的网络标识,用十进制表示的话就是224.0.0.0~239.255.255.255。D类地址没有主机标识,常被用于多播。

网络号相同的计算机必须同属于同一个链路,而直接使用A类、B类、C类地址会造成极大的浪费,为此,就加入了子网掩码。在IP地址的定义中,IP地址是由网络号、主机号两部分组成的,但是现在基本以网络号、子网号和主机号来划分,通过子网掩码可以细分出比A类、B类、C类更小粒度的网络。

例如现在有一个C类地址为196.20.100.54,子网掩码为255.255.255.0,则可以计算出网络号为196.20.100.0,主机号为0.0.0.54。又例如要计算255.255.248.0这个子网掩码可以最多容纳多少台计算机,先把其转换为二进制数字,即11111111.1111111.11111000.00000000,然后后面一共有11个0,即2的11次方,等于2048,再减去保留地址和广播地址两个地址,最后可以算出最多可以容纳2046台计算机。

2、DNS协议

虽然DNS是应用层的协议,但是它与IP有着密不可分的关系,所以先在这里进行介绍。DNS的作用就是把域名解析成对应的IP地址。TCP/IP网络中要求每一个互连的计算机都具有其唯一的IP地址,并基于这个IP地址进行通信。也就是说,假如没有DNS,我们访问百度的时候,就只能通过一个其IP地址去访问,如202.108.22.5。相比之下,明显记忆www.baidu.com这个域名会容易得多,而DNS会帮我们把这个域名解析成对应的IP地址。

3、ARP协议

ARP的作用是根据IP地址获取其MAC地址。ARP是借助ARP请求包和ARP响应包来确定MAC地址的。例如,主机A想要获取主机B的MAC地址,它会先通过广播发送一个ARP请求包,这个包中包含了主机B的IP地址。这些广播的包会被同一个链路上所有的主机或路由器进行解析,如果ARP请求包中的目标IP地址与当前主机的IP地址一致,那么这个节点就将自己的MAC地址写到ARP响应包中,并返回给主机A,这样主机A就获取到了主机B的MAC地址。

想一想,为什么有了MAC地址还需要IP地址呢?

IP地址可以通过网络号来寻址,当只使用MAC地址的话,人们是无法知道这台机器所处的位置,所以需要大范围的发包,这会浪费巨大的网络流量。而且由于没有任何集约机制,网桥就不得不维护一张巨大的表格来维护所收到的MAC地址,当这些信息超过网桥能够承受的极限,网桥就GG了。

4、RARP协议

RARP是将ARP反过来,从MAC地址定位到IP地址的一种协议。例如对于使用嵌入式设备时,会遇到没有任何输入接口或无法通过DHCP动态获取IP地址的情况,此时就可以使用RARP。当设备在RARP服务器上注册过后,这个设备在接入网络时,会发送一条类似“我的MAC地址是xxx,快告诉我,我的IP地址是什么”的请求信息,RARP服务器接收到这个消息之后就会返回一个包含对应IP地址的响应包,而设备就可以根据这个响应包的信息来设置自己的IP地址了。

5、ICMP协议

ICMP的主要作用是确认IP包是否成功送达目标地址、反馈IP包在发送过程中被废弃的原因等。例如,还记得IP数据报中的TTL字段吗?当IP数据报的TTL值为0时,该包就会被丢弃,此时,IP路由器会发送一个ICMP超时错误的信息给发送端,通知该包已被丢弃。简单来说,ICMP协议就是为IP协议提供服务的。

ICMP的消息大致可以分为两类,一类是查询报文,另一类是差错报文。差错报文就是上面所说的,而查询报文最常见的用途就是ping命令啦。

6、DHCP协议

在我们为计算机设置IP地址时,通常都会有个自动获取IP地址的选项,这个功能就是通过DHCP协议实现的。通过DHCP协议,当计算机接入到网络时,就可以自动到DHCP服务器上获取通信所必须的设置,而无需我们进行手动设置。由于IP地址交给了DHCP服务器管理了,这就避免了IP地址的冲突。

四、传输层

1、端口号

端口号是用来识别同一台计算机中进行通信的不同应用程序。在一台计算机上可以同时运行多个应用程序,而传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并将数据准确的传输。但是仅凭一个端口号来识别某一个通信是远远不够的,通常是通过源IP地址、目标IP地址、源端口号、目标端口号、协议号这5个信息来识别的。这5项中只要有一项不同,就会被认为是不同的通信。

2、UDP

UDP是一种没有复杂控制,提供面向无连接通信服务的一种协议。并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。UDP数据报的格式非常简单,如下:
这里写图片描述
源端口号。可选项,表示发送端端口号。没有源端口号的时候,该字段的值为0。
目标端口号。表示接收端端口。
包长度。保存了UDP首部的长度跟数据的长度之和。

UDP的特点总结起来为:

  • UDP是一种面向无连接的、不可靠的传输层协议
  • UDP提供了有限的差错检验功能
  • UDP协议设计得这么简单的目的是希望以最小的开销来达到网络环境中的进程通信目的

3、TCP

TCP的主要作用是保证可靠的传输。TCP作为一种面向连接的协议,只有在确认通信对端存在时才会发送数据,它充分地实现了数据传输时各种控制功能,通过检验和、序列号、确认应答、重发机制、连接管理、窗口控制等机制实现可靠性传输。

(1)可靠性

在TCP中,当发送端的数据到达接收端时,接收端会返回一个已经收到消息的通知,这个消息叫做确认应答(ACK)。当发送端将数据发送出去之后会等待对方的ACK,在一定时间内没有收到ACK,发送端就会认为数据已经丢失,并进行重发,因此,即使产生了丢包,仍然可以通过重发来确保数据能够送达接收端。当然,未收到ACK并不一定是数据丢失,有可能是对方收到数据,但返回的ACK在途中丢了;也有可能是因为网络延迟等原因。此时,发送端只要重发数据即可,但这对于接收端来说,就很尴尬了,它会反复收到相同的数据,并放弃掉重复的数据报。因此,就必须引入一种能够识别是否已经接收到数据,又能够判断是否需要接收的机制。

通过序列号,可以实现确认应答处理、重发控制、重复控制等功能。序列号是按顺序给发送数据的每一个字节都标上号码的编号,接收端查询TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返回。就这样,通过序列号和确认应答,TCP就可以实现可靠传输。

(2)三次握手与四次挥手

这里写图片描述

三次握手:首先由客户端发出连接请求,服务端收到请求后进行回复,最后客户端再进行一次确认,然后建立了连接。

(补充:为什么要进行三次握手,而不是两次呢?
如果只有两次握手的情况下,假设现在客户端发出一个连接请求,但在发送过程中报文丢失了,于是客户端进行重传,服务端收到重传的报文之后就建立连接,之后就进行数据传输以及释放连接。在这过程中,客户端总共发送了两个连接请求,一个丢失了,一个达到了。但是,如果客户端发送的第一个连接请求没有丢失,而是因为网络原因以至于连接释放后才到达了服务端,这本来是一个已经失效的请求,但是服务端接收到了该失效的请求后,就会误认为是客户端又发出一次新的连接,结果建立连接后由于客户端并没有发出建立连接的请求,因此不会向服务端发送数据,而服务端却一直等待客户端发送数据,这样就白白浪费了服务端许多资源。 采用三次握手就可以防止上述现象发生,在上述情况下,客户端不会向服务端的确认发出回应,服务端收不到回应,自然就知道客户端并没有要求建立连接。)

四次挥手:客户端发起中断请求,服务端接收到FIN报文后,知道客户端已经没有数据要发送了,但服务端可能还有数据没发完,所以服务端先发送一个ACK报文作为回应。当服务端的数据也发送完毕后,就向客户端发送FIN报文,告诉它我的数据也发完了,准备关闭连接。客户端接收到之后就发送确认报文进行回应,并等待2MSL后依然没有收到回复,则证明服务端已经正常关闭了,客户端也就可以关闭了。

(3)窗口控制

TCP以一个MSS(Maximum Segment Size)为单位,每发送一个段就进行一次确认应答的处理。这样就导致了如果包往返的时间越长,通信性能就越低。为了解决这个问题,TCP引入了窗口这个概念。窗口内的数据即使没有收到确认应答也可以被发送出去,如果其中出现了丢包,还是会进行重传的。当收到确认应答的时候,窗口就可以滑动到确认应答中序列号的位置,所以它也被称为滑动窗口控制。(网上有很多关于滑动窗口的过程及原理,在这里就不介绍了。)

(4)拥塞控制

有了窗口控制,就能够连续发送大量的数据包。然而,在网络出现拥堵的情况下,如果突然发送大量的数据,极有可能会导致整个网络的瘫痪。TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法,对发送的数据量进行控制。为了调节发送端的数据量,定义了一个叫做“拥塞窗口”的概念。拥塞窗口首先以1个数据段发送数据,之后随着包的每次往返,会以2的指数幂进行增长,当到达一定阀值后,就按一定比例进行增长。(拥塞窗口的具体过程和原理请自行查阅资料。)

(5)TCP首部
比起UDP,TCP数据报显得复杂得多,TCP数据报的格式如下:
这里写图片描述

五、应用层

应用层上的协议非常多,这里就不进行过多的介绍了,比较经典的几款应用协议包括:

  • 远程登录。主要使用TELNET和SSH两种协议。TELNET利用TCP的一条连接,通过这一条连接向主机发送文字命令并在主机上执行。SSH是加密的远程登录,使用SSH后可以加密通信的内容,确保了信息的安全。
  • 文件传输。文件传输协议(FTP)是在两个相连的计算机之间进行文件传输时使用的协议。
  • 电子邮件。提供电子邮件服务的协议叫做SMTP,它建立一个TCP连接以后,在这个连接上进行控制和应答以及数据的发送。

另外,当我们通过浏览器访问Web页面的时候,使用的是HTTP协议,这个协议也是非常重要的,具体详情可以参考 HTTP协议详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值