基础通信网络学习之二
-
数据的封装和解封装
数据的发送过程和物品的邮寄比较类似,在邮寄物品的时候,会将物品封成包裹,填上收发人的信息,数据的转发也是如此,需要给待发送的数据封装上头部报文,在报文中包含了IP地址,MAC地址等信息。如图所示为数据的封装与解封装过程。
![]()
![]()
在TCP/IP分层结构中,对等层之间互相交互的数据称为PDU,称为协议数据单元。PDU在不同层有约定俗成的名称。如在传输层中,在上层数据中加入TCP报头后得到的PDU被称为数据段;数据段被传递给网络层。网络层添加IP报头得到的PDU被称为数据包;数据包被传递包被传递到数据链路层,封装数据链路层报头得到的PDU被称为数据帧;最后帧转换为比特,通过网络介质传输。
假设两台主机A,B进行通信。主机A的某个应用通过上层协议转换上层数据后交给传输层;传输层将应用层的PDU作为自己的数据部分并封装传输层报头,如果报文较大,则进行分段,形成传输层的PDU,然后传递给网络层;网络层将传输层的PDU作为本层的数据部分,加上网络层的头部信息,形成网络层的PDU,传递给数据链路层;数据链路层在头部添加数据链路层的报头,形成数据帧,然后传递给物理层;物理层将数据转换为比特流,通过物理线路传送给主机B。这种协议栈向下传递数据,并添加报头和报尾的过程就称为封装。
数据链路层被表示为LLC和MAC两个逻辑子层。在实际应用中,根据协议的不同,有时候只需要封装MAC子层的头部信息即可。而帧校验序列,主要用于校验数据在传输过程中有无发生错误,是一种错误检验机制。
而当数据通过网络传输后,到达接收设备,接收方将删除添加的信息,并根据报头中的信息决定如何将数据沿协议栈上传给合适的应用程序,这个过程称为解封装。如上图中,主机B在物理层接收到比特流后交给链路层处理,数据链路层收到报文后,从中拆出数据链路层报文头后将数据传递到网络层,网络层收到报文后,从中拆离出IP报文头,交给传输层处理,传输层拆离传输头部后交给应用层。
数据的封装和解封装都是逐层处理的过程,各层都会处理上层或下层的数据,并加上或剥离到本层的封装报文头。不同设备的对等层之间依靠封装和解封装来实现相互间的通信。
举例说明数据封装和解封装过程
1、从 计算机A 的应用层内网通软件向 计算机B 发出一个消息,生成数据。
2、请求从计算机A的应用层下到 计算机A 的传输层,传输层在上层数据前面加上 tcp 报头,报头中包括目标端口以及源端口。
3、传输层数据下到网络层, 计算机A 在网络层封装,源 ip 地址为 计算机A地址,目标 ip 地址为 计算机B 地址。
4、计算机A 将 计算机B 的 ip 地址和子网掩码与自己做比对, 可以发现 计算机B与自己处于相同的子网。所以数据传输不必经过网关设备。
5、数据包下到 计算机A 的数据链路层进行封装,源 mac 地址为 计算机A的 mac 地址,目标 mac 地址查询自己的 arp 表。
6、计算机A 把帧转换成 bit 流,从物理接口网卡发出。
7、物理层接收到电信号,把它交给数据链路层进行查看帧的目标 mac 地址,和自己是否相等,如果相等说明该帧是发送给自己的,于是将mac帧头解开并接着上传到网络层。
8、网络层查看目标 ip 地址和自己是否匹配,如果匹配即解开ip头封装。然后再把数据上传到传输层。
9、传输层解开对应的包头之后,继续把数据传给应用层,计算机B即可接收到计算机A发的消息。
![]()
如上图可以看到的抓包结果,从上层到下层的封装协议为TCP,IP,Ethernet II。
-
协议和标准
常见协议的介绍
-
TCP
在TCP/IP模型中,传输层位于应用层和网络层之间,为终端主机提供端到端的连接,主要的协议有两种:TCP和UDP。TCP提供面向连接的,可靠的字节流服务,而UDP则为用户提供简单的,面向数据报的服务。
![]()
![]()
TCP数据段由头部(TCP Head)和数据(TCP Data)组成。由于TCP头部中用于指示头部长度的字段为4 bit,其最大值是15,表示最大可有15个 32 bit, 因此TCP最多有60 个字节的头部。如果没有选项字段.则TCP头部的长度是20字节。每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端的应用进程端口号加上IP头部中的源端IP地址和目的端IP地址能够唯一确定一个TCP连接。序列号则用来标识从TCP发端向TCP收端发送的数据字节流.它表示在这个报文段中的第一个数据字节。窗口大小用于表示接收端期望接收的字节,由于该字段为16 bit,因而窗口大小最大为65535字节。检验和则是针对整个TCP报文段以及部分IP头中的信息进行的报文验证。
TCP提供一种面向连接的、全双工的、可靠的字节流服务。
在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
TCP的接收端必须丢弃重复的数据。
TCP对字节流的内容不作任何解释。对字节流的解释由TCP连接双方的应用层解释。
TCP通过下列方式来提供可靠性:
1.应用数据被分割成TCP认为最适合发送的数据块,称为报文段或段。
2.TCP协议中采用自适应的超时及重传策略。
3.TCP可以对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
4.TCP的接收端必须丢弃重复的数据。
5.TCP还能提供流量控制。
源端口和目的端口:各占2个字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口实现
序号字段:占4字节。TCP连接中传送到数据流中的每一个字节都编上一个序号。序号字段的值则是指的是本报文段所发送的数据的数据的第一个字节的序号
确认号字段:占4字节。是期望收到对方下一个报文段的数据的第一个字节的序号
数据偏移:占4位。它指出数据的起始位置处距离 TCP报文段的起始处有多远,实际就是TCP报文段的首部长度。
保留字段:占6位。保留为今后使用,但目前应置为0
紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效
复位比特RST(Rest):只有当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接
同步比特SYN:同步比特SYN设置为1,就表示这是一个连接请求或连接接收报文。
终止比特FIN(Final):用来释放一个连接。当FIN=1时,表明此报文的发送端的数据已发送完毕,并要求释放运输连接
窗口字段:占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确认自己的接收窗口大小,然后通知对方确定发送窗口的上限
校验和:占2字节。校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部
紧急指针字段:占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
选项字段:长度可变。TCP首部可以有多达40字节的可选消息,用于把附加信息传递给终点,或用来对齐其他选项
填充字段:这是为了使整个首部长度是4字节的整数倍
TCP首部的主要选项
最大报文段长度MSS是TCP报文段中的数据字段的最大长度
窗口扩大因子,窗口扩大选项用于扩大TCP通告窗口,使TCP的窗口定义从16bit增加为32bit。
时间戳,可以用于测量往返时延RTT
TCP的数据编号与确认
TCP是面向字节的。TCP将所要传送的报文看成是字节组装成的数据流,并使每一个字节对应一个序号。
在连接建立时,双方都要商定初始序号。TCP每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。
TCP的确认是接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号+1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。
为了提高效率,TCP可以累计确认,即在接收多个报文段后,一次确认。
-
TCP三次握手与四次挥手
通过图来梳理TCP-IP协议相关知识。
TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。如图1所示,给出了TCP通信过程的示意图。
![]()
上图主要包括三部分:建立连接、传输数据、断开连接。
建立TCP连接很简单,通过三次握手便可建立连接。建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。断开连接的过程也很简单,通过四次握手完成断开连接的过程。
三次握手建立连接:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
传输数据过程:
a.超时重传.
超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq 号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。
b.快速重传
接受数据一方发现有数据包丢掉了。就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重 传。比较超时重传和快速重传,可以发现超时重传是发送端在傻等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。
c.流量控制
这里主要说TCP滑动窗流量控制。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己 还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 滑动窗可以是提高TCP传输效率的一种机制。
d.拥塞控制
滑动窗用来做流量控制。流量控制只关注发送端和接受端自身的状况,而没有考虑整个网络的通信情况。拥塞控制,则是基于整个网络来考虑的。考虑一下这 样的场景:某一时刻网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,但是,重传会导致网络的负担更重,于是会导致更大的延迟以及更多 的丢包,于是,这个情况就会进入恶性循环被不断地放大。试想一下,如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成"网络风 暴",TCP这个协议就会拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。
更多的详细信息关于TCP机制的内容可以看一下这个博客「图解」TCP重传、滑动窗口、流量控制、拥塞控制。https://baijiahao.baidu.com/s?id=1664395039305097355&wfr=spider&for=pc
或者看TCP/IP协议详解这个书
四次握手断开连接:
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当 然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
以上是TCP握手一些基础。建议去深入TCP/IP过程,对网络的理解才会更深。
-
TCP可靠性
TCP的可靠传输还体现在确认技术的应用方面,保证数据流从源设备准确无误地发送到目的设备。以下描述的是确认技术的工作原理。
当目的设备接收到源设备发送的数据报时,向源端发送确认报文,源设备收到确认报文后,继续发送数据报,如此重复。当源设备发送数据报后没有收到确认报文,在一定时间后(源设备在发送数据报时启动计时器,计时器开始计时到结束的时间),源设备降低数据传输速率,重发数据报,如图所示:TCP重传
![]()
源设备与目的设备建立了一条端到端的虚链路,开始数据传输。源设备向目的设备发送seq=n,ack=m, 长度为q的数据报,目的设备收到数据报后,用seq=m, ack=n+q来确认正确接收此数据报,源设备收到确认信息后,继续发送seq=n+q起始的数据报。目的设备如果未能正确接收到数据报,则继续用seq=m, ack=n+q的确认报文来进行确认,表示目前只正确接收到序列号为 n的数据报。源设备收到 seq=m, ack=n+q的确认报文后,重发序列号为n~n+q-1的数据报,当目的设备正确接收到数据报后,用ack=n+q 的报文进行确认
TCP在保证数据传输的可靠性的同时,还提供了多路复用、最大报文段(Maximum Segment Size, MSS)协商、窗口机制等功能。
多路复用是指多个应用程序允许同时调用传输层从而为不同的应用建立各自的连接通道。传输层把上层发来的不同应用程序数据分成段,按照先到先发( First Input First Output, FIFO )的原则(或者其他原则)发送数据段。这些数据段可以去往同一目的地,也可以去往不同目的地。
MSS表示TCP传给另一端的最大报文段长度。当建立一个连接时,连接的双方都要通告各自的MSS, 协商得到MSS的最终值。MSS的默认值为536,因此它允许IP数据包长度为576字节(536+ 20字节IP头部+20字节TCP头部)。通过协商最大报文段长度值,可以更好地提高网络利用率和提升应用性能。
TCP滑动窗口技术通过动态改变窗口大小来调节两台主机间的数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口;一个用于接收数据,另外一个用于发送数据。
服务器在和客户端建立TCP连接后,在报文的交互过程中,服务器和客户端都会将自己的缓冲区大小(窗口大小)分别发送给对端。如图所示为滑动窗口机制,服务器通告给客户端的窗口大小为 3,而客户端通告给服务端的初始窗口大小为4。
![]()
服务端开始发送数据,连续发4个单位的数据,在发送完这一波数据后,服务端暂停数据发送,需等待客户端的确认。客户端接收服务器发送过来的数据后,缓冲区逐渐被填满,这时候缓冲区中的两个报文被进程读取,缓冲区有了两个空位.于是客户端向服务器发送一个ACK,这个报文中指示窗口大小为2。服务器收到客户端发过来的ACK消息,并且知道客户端将窗口大小调整为2,因此它只发送了2个单位的数据,并且等待客户端的下一个确认报文,如此反复。
-
UDP
UDP为应用程序提供面向无连接的服务,所以在传数据之前,源端和目的端之间不必像TCP那样需要事先建立连接。正由于UDP是基于无连接的传输协议,所以UDP不需要去维护连接状态和收发状态,因此服务器能以多播或者广播的形式同时向多个客户端传输相同的消息。UDP的报文头部格式如图。
与TCP的报文头部格式进行比较, UDP头部中不包含序列号,因此UDP不保证可靠性,即不保证报文能够到达目的地。UDP更适用于对传输效率要求高的应用,如SNMP、 Radius等。SNMP监控网络并断续发送告警等消息,如果每次发送少量信息都需要建立TCP连接,无疑会降低传输效率,所以诸如SNMP、 Radius等更注重传输效率的应用程序都会选择UDP作为传输层协议。如图列举了TCP和UDP之间的不同之处。
![]()
![]()
![]()
-
IP协议
IP是TCP/IP协议族中最为核心的协议。所有的TCP,UDP等数据都以IP数据包格式传输,ip协议提供不可靠。无连接的数据包传送服务。
不可靠的意思是,它不能保证IP数据包能成功地到达目的地。IP仅提供尽力而为的传输服务。如果发生某种错误,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法,即丢弃该数据包,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如 TCP)。
无连接的意思是,IP并不维护任何关于后续数据包的状态信息。每个数据包的处理是相互独立的。这也说明,IP数据包可以不接发送顺序接收。如果某一信源向相同的信宿发送两个连续的数据包(比如先发送A,然后是B),每个数据包都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。1Pv4头部的格式如图所示,所示是抓包软件中看到的IP报文封装结构。
![]()
![]()
![]()
版本号(Version )。IP协议的版本号,目前的协议版本号为4。下一代IP协议的服本号为6。
报文长度。IP头部的长度,字段总共4位,以4字节为单位。常规情况下取值为5,即头部长度为20字节,最大取值为15,即IP头部的最大长度为60字节。
服务类型(Type of Service, TOS )。共8位。包括一个 3 位的优先权字段(Class of Service, cos) , 4位TOS字段和1位未用位。4位TOS分别代表最小时延、最大吞吐量,最高可靠性和最小费用,只能置其中一位为1.如果所有4比特均为0,那么意味着是一段服务。COS用于表示报文优先级。
总长度(Total lengthl 。整个IP数据包长度,包括数据部分。该字段长16 位, IP数据包最长可达65535字节,2的16次方减1。尽管可以传送一个长达65535字节的IP数据包,但是大多数的链路层都会对它进行分片。而且,主机也要求不能接收超过 576字节的UDP数据包。UDP限制用户数据包长度为 512字节,小于 576字节。但是,事实上现在大多数的实现(特别是那些支持网络文件系统NFS的实现)允许超过8192字节的IP数据包。
标识符(Identificationl)在一对主机之间一一标识主机发送的每一份数据包。通常每发送一份报文,它的值就加1.一般情况下,数据链路层会限制每次发送数据帧的最大长度。如果IP包的长度超出了链路层的帧长,数据包就需要进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。把一份IP数据包分片以后,只有到达目的地才进行重新组装,重组由目的端的IP层来完成。标识符字段的值在数据包被分片时会被复制到每个分片中,用于数据分片在目的主机上的重组。
标志位。占3比特、第一位保留,取值为0;第二位(DF)代表报文是否可以进行分片,取值为0代表可以分片,取值为1代表不能分片;第三位(MF)代表是否为最后一个分片,取值为0代表该分片是最后一个分片,取值为1代表还有更多的分片。DF和MF的取值不能同时为1。
片偏移。片偏移乘以8指的是该分片偏移原始数据包开始处的位置。同样用于目的主机的分片重组。
生存时间(TTL)。数据包可以经过的路由器数目。每经过一个路由器, TTL
值就会减1,当该字段值为0时,数据包将被丢弃。
协议。在数据包内传送的上层协议,和端口号类似,IP协议用协议号区分上层协议。例如,协议字段取值6代表上层协议是TCP,取值为17 代表上层协议是UDP。
报头校验和(Head checksum )。IP头部的校验和,用于收端检查报文头部的完整性。源IP地址和目的IP地址字段标识数据包的源端设备和目的端设备。
源IP地址和目的 IP地址。标识数据包的源端地址和目的端地址。















浙公网安备 33010602011771号