本文将首先介绍TCP/IP四层模型,及其和OSI参考模型的对应关系。接着,介绍TCP/IP四层模型中设计到的主要协议。
在TCP/IP协议中,将OSI模型的七层架构简化成了四层,如下图所示。
在上图中,同时给出了TCP/IP四层模型中,各层常用的协议。下面将逐个介绍这些协议。
1、链路层
(1)ARP和RARP协议
在TCP/IP四层模型中,将ARP和RARP协议分到了链路层,其实在实际应用过程中,两种往往介于链路层和网络层之间。为什么这么说呢?根据链路层的特点,链路层不能够识别网络层中的IP地址,只能够识别物理地址(MAC地址),当数据从网络层向链路层传播时,需要将IP地址转化成MAC地址(ARP地址转换协议的作用),从而定义了ARP协议。反过来说,当数据从链路层向上传播给网络层时,需要将MAC地址转换成IP地址(RARP反地址解析协议的作用),从而又定义了RARP协议。
总结起来,就是:
ARP 协议:IP地址—>MAC地址
RARP协议:MAC地址—>IP地址
ARP协议具体的工作过程是:当ARP协议收到请求后,首先查找ARP缓冲区中是否存在此IP地址的映射(即其MAC地址),若存在,直接返回此MAC地址;否则,发送一条ARP请求广播。此时网络中,所有的主机都会收到此条广播,只有IP地址为待寻找IP地址的主机才会应答(其他主机丢弃此请求),那么ARP就得到了对应主机的MAC地址,并将其存入ARP缓冲区中。
RARP协议的工作过程:RARP协议一般工作在无盘工作站,因为无盘工作站不存放自己的IP地址,但知道自己的MAC地址。若需要其IP地址时,无盘工作站会向RARP服务器发送RARP请求,以获取IP地址。
(2)以太网帧格式
上图中的目的地址和源地址指的都是MAC地址。
在以太网帧格式中,需要注意占2个字节的“类型”。此变量决定了在分用过程中,网络层该利用哪个协议。如0800为IP协议、0806为ARP协议,8035为RARP协议。
接下来了解一下封装和分用(解封)的概念。
所谓封装,就是将数据打上一定的头部,让对等方能够认识的过程。而分用与之相反。在网络中,数据的传输是从上到下,又从下到上的过程,如下图所示。
当在封装过程中,打上相应的首部之后,对等方就能够认识传来的数据信息。比如,对于封装过程,以太网帧格式中,2个字节的“帧类型”指定了发送方利用的网络层协议。传输到对等方后,网络层会根据以太网首部中的“帧类型”选择相同的网络层协议,从而实现对等通信。
2、网络层
(1)ICMP协议
ICMP(Internet控制报文协议)是一种面向无连接的协议,它用于传输出错报告控制信息。当遇到IP数据无法访问目标、IP路由无法按当前速率转发数据包等情况是,会自动发送ICMP数据包。ICMP的包具有一个8个字节长度的包头,其中前4个字节的格式固定,包含8位类型字段、8位代码字段以及16位的校验和;后4个字节根据ICMP的包类型不同而不同。
(2)IGMP协议
Internet 组管理协议称为IGMP协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。
IGMP提供了在转发组播数据包到目的地的最后阶段所需的信息,实现如下双向的功能:
1、主机通过IGMP通知路由器希望接收或离开某个特定组播组的信息。
2、路由器通过IGMP周期性地查询局域网内的组播组成员是否处于活动状态,实现所连网段组成员关系的收集与维护。
(3)IP数据报文格式
上图显示了IP数据报文格式,现将逐个介绍图中各个数据的含义。
- 版本号:目前用于区分IPV4和IPV6,占4位;
- 首部长度:占4位,这里的单位为4个字节。即当取最大数1111=15时,首部长度=15x4=60个字节。当IP首部的数据长度不足4个字节的整数倍时,必须利用后面的填充字段加以填充。这样,数据部分保证永远从4字节的整数倍开始,这样便于IP协议的实现。
- 服务类型:占8位,用以获取更好的服务。貌似没被用过。。。。。。
- 总长度:指的是IP首部及数据的总长度,单位为字节。由于占16位,因此范围为0~65535字节。在链路层,存在一个最大传输单元(MTU)。当IP层封装数据时,总长度如果超过了MTU,就需要分片。
- 标识:16位,每发送一个IP包,改值加1,直到最大值65535。此时,再发送IP数据包时,该值总0开始循环。若在IP层进行分片时,该值会被分到所有的字片当中。由于TCP是无连接的服务,数据报不存在按序接收的问题。标识位的出现能够保证,接收端能使得所有拥有相同标识位的字片重新组装起来。
- 标志:占3位。但目前只有两位能用,中间为DF,若为0,表示能分片,若为1,表示不能分片。最低位MF,若为0,表示后面没有包(该包为最后一个包);若为1,表示后面还有包。
- 片偏移:占13位,与更多段位组合,帮助接收方组合接收的报文;
- 生存时间:8位,最多可经过的路由器数量。每经过一个路由器该值减1。若减为0后,数据还未到达,会丢弃数据,并发送ICMP报文通知原主机。可避免数据包在路由器之间循环。
- 头部检验和:16位,只校验数据报报文头部数据的完整性,但校验并不包括数据部分。
3、传输层
3.1 TCP协议
(1)TCP协议的特点
- 基于字节流的传输服务,不假定边界。从而,一段数据可能并不会一次传输完成,或者一次能够接收多个TCP段,使得TCP协议产生“粘包问题”。
- 面向连接的传输服务
- 利用网际校验和,在逻辑上能保证可靠传输,保证数据不会失序和重复
- 缓冲传输
- 全双工传输
- 通过滑动窗口,实现了流量控制
(2)TCP数据报文格式
上图显示了TCP数据报文的格式,下面分别介绍几个重要的数据。
16. 序列号:32位,表示这个报文段中第一个数据字节序号
17. 确认号:32位,表示期望下一次收到的字节序号
18. ACK:1位,为1时,确认位有效
19. SYN:1位,为1时,表示发起一个连接(同步信号)
20. FIN:1位,为1时,表示终止一个连接
21. 窗口尺寸:16位,通过窗口大小实现流量控制
22. TCP校验和:16位,对TCP首部和数据进行校验
(3)TCP建立连接的三次握手过程
上图简要的描述了TCP三次握手的过程。简述如下:
1. 首先,由TCP A发起一个连接,即发送一个SYN=1,序列号为a的TCP段给TCP B;
2. TCP B收到来自A 的报文后,也向A发起一个连接,并确认已收到来自A的数据包,即发送一个SYN=1,序列号为b,ACK=1,并且确认号为a+1的TCP段;
3. A收到来自B的数据后,给B发送一个确认信号,表示已收到来自B的信息,即发送ACK=1,确认号为b+1的TCP段。
在此,有一个比较重要的问题就是:为什么要建立三次握手,而不是两次或四次?
答案1:
这个问题,其实相对于两次握手来说,中间就多了一个A的确认过程。这是因为,为了防止已失效的连接请求报文段又突然传送给B,从而产生错误。“已失效的连接请求报文段”的产生在这样一种情况下:A发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A再次发出的一个新的连接请求。于是就向A发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要B发出确认,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立,并一直等待A发来数据。这样,B的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。”
答案2:
还有一种说法,就是TCP三次握手的本质是“确认A和B发送数据的初始序列号”。如果两次握手,即没有最后A的确认过程时,此时A与B的连接中B已经确认知道了A的初始序列号,但并不知道A是否已收到自己的初始序列号。从而无法进行可靠的数据传输。
(4)TCP断开连接的四次挥手过程
TCP断开连接的四次挥手过程如下:
A和B双方都能通过调用close()函数来发起断开连接。在这里,以A调用close()函数为例。
- A发出连接释放请求信号并确认B上次所发送的数据,即发送一个FIN=1,序列号为x,ACK=1,确认号为y的数据包。在这里,可以推测出,在前一次通信过程中,B给A发送了一个序列号为y-1的数据包。
- B收到来自A的数据包后,发出确认信号,即ACK=1,确认号为x+1,此时A和B的连接中,A已退出本次连接。并且,A进入“等待状态”,等待B的连接释放请求信号。
- 当B的数据发送完之后,就会想A发出连接释放请求,并确认A上次发来的数据。即发送FIN=1,序列号为y,ACK=1,确认号为x+1的数据包。
- 当A收到B的请求后,回复一个确认信息。即ACK=1,确认号为y+1。
在上述过程中,为什么A要进入“等待状态”呢?为啥B不直接发送释放连接请求呢?
答:
- 因为发送连接释放请求时,是应用层来调用close()函数。而TCP发送数据包时,速度很快(可以认为是瞬间完成),而调用close()函数是不能瞬间完成的。
- 再者,考虑B发送的请求释放信号在传输过程中丢失了,A并没有收到B的连接释放请求,B超时会重传。此时,若A等待,就能够收到来自B的连接释放请求,再回复确认就释放了B的连接。否则,A不会收到来自B的请求。
(5)TCP如何保证可靠性
对于一个传输活动,其不可靠性体现在:
(1)差错:TCP通过校验和在逻辑上保证不出差错;
(2)丢包:TCP通过超时重传和确认机制解决
(3)失序:根据TCP首端序列号,将收到的数据重新排序
(4)重复:根据TCP首端序列号,保证不会重复
此外:
(5)TCP提供流量控制
(6)应用数据被分割成TCP认为最适合发送的数据块,成为“段(segment)”传输给网络层。
(6)UDP的特点
- 无连接的,不可靠的传输服务
- 一般情况下UDP更高效
- UDP并没有超时重传和确认机制,它不提供复杂的控制机制。它按照应用程序发来的数据,在接收到的那一刻,立刻按照原样发送到网络上。即使出现网络拥堵的情况,UDP也不会采取流量控制等避免网络拥塞的行为。此外,传输过程中出现乱序、丢包、重复等,UDP都不会重发或纠正。
(7)TCP与UDP的区别
- TCP面向连接,而UDP是无连接的;
- TCP保证可靠交付,即无差错、重复、丢包、失序,且按时到达;而UDP不保证可靠传输;
- TCP面向字节流,即TCP把数据看成一连串无结构的字节流;而UDP是面向报文的,并且UDP没有拥塞控制;
- TCP只支持点到点传输;而UDP可以实现一对多,多对一,一对一传输;
- TCP的通信信道是全双工的可靠信道;UDP是不可靠信道。