手机版

tcp、udp、ip协议分析_电源节点Java研究所整理

时间:2021-09-04 来源:互联网 编辑:宝哥软件园 浏览:

在互联网的早期,网络控制协议用于主机之间的互连。这个协议本身有很多缺陷,比如:不能互联不同的主机、不同的操作系统,并且没有纠错功能。为了改善这个缺点,丹尼尔开发了TCP/IP协议。现在几乎所有的操作系统都实现了TCP/IP协议栈。

TCP/IP协议栈主要分为四层:应用层、传输层、网络层和数据链路层,每层都有相应的协议,如下图所示

所谓协议,就是双方之间数据传输的一种格式。整个网络中使用了许多协议。幸运的是,每个协议都有RFC文档。这里只分析IP、TCP和UDP协议头。

首先,看看网络中以太网数据包的格式:

在Linux操作系统中,当我们想要发送数据时,只需要在上层准备好数据,然后提交给内核协议栈,内核协议栈会自动添加相应的协议头。让我们来看看在每一层添加的协议头的具体内容。

一、TCP协议

TCP协议是一种面向连接、保证高可靠性(无数据丢失、无数据无序、无数据错误、无数据重复到达)的传输层协议。

1.TCP报头分析

首先,分析TCP报头的格式和每个字段:的含义

(1)端口号[16位]

众所周知,网络实现了不同主机之间的进程间通信。在操作系统中,有许多进程。数据到达后,应该提交给哪个流程进行处理?这需要一个端口号。在TCP报头中,源端口和目的端口。源端口号标识发送主机的进程,目的端口号标识接收主机的进程。

(2)序列号[32位]

序列号分为发送序列号和确认号。

发送序列号:用于标识从TCP源发送到TCP目的地的数据字节流,表示该报文段中第一个数据字节的序列号。如果字节流被视为两个应用程序之间的单向流,TCP会按序列号对每个字节进行计数。序列号是一个32位无符号数,当它达到232-1时从0开始。建立新连接时,SYN标志变为1,序列号字段包含该主机选择的连接的初始序列号ISN(InitialSequenceNumber)。

确认序列号:它包含预期由确认发送者接收的下一个序列号。因此,确认序列号应该是最后一个成功接收的数据字节序列号加1。确认序列号字段仅在确认标志为1时有效。TCP为应用层提供全双工服务,这意味着数据可以双向独立传输。因此,连接的每一端都必须保持每个方向上的传输数据序列号。

(3)偏移[4位]

这里的偏移量实际上是指TCP报头的长度,用来表示TCP报头中32位字的个数,通过它我们可以知道一个TCP包的用户数据从哪里开始。该字段占用4位。如果4位的值为0101,则TCP报头的长度为5 * 4=20字节。因此,TCP的最大报头长度为15 * 4=60字节。但是没有可选字段,正常长度为20字节。

(4)保留[6位]

它当前未被使用,其值都是0

(5)符号[6位]

TCP报头中有6个标志位。其中许多可以同时设置为1。

URG紧急指针有效

确认序列号有效

PSH表示,接收方应该尽快将该消息段移交给应用层,而不必等待缓冲区满了。RST通常意味着断开连接

例如,一个TCP客户端在没有监听端口的情况下启动到服务器的连接。wirshark按如下方式抓取数据包

可以看到,主机:192.168.63.134向主机:192.168.63.132发起了连接请求,但是主机:192.168.63.132不在服务器端监听对应的端口。在这个时候,

主机: 192.168.63.132发送一个RST设置为断开的TCP数据包。

同步序列号用于启动连接

FIN发送方完成发送任务(即断开连接)

(6)窗口大小[16位]

窗口的大小指示源方法可以接受的最大字节数。

(7)校验和[16位]

校验和覆盖了整个TCP段:TCP报头和TCP数据。这是一个必填字段,必须由发送方计算和存储,并由接收方验证。

(8)紧急指针[16位]

紧急指针仅在URG标志设置为1时有效。紧急指针是正偏移,它与序列号字段中的值相加,以指示紧急数据最后一个字节的序列号。TCP的紧急模式是发送方向另一端发送紧急数据的一种方式。

(9)TCP选项

这是可选的。当我们抓住后面的包时,我们正在看它

2.专注于详细解释

(1)三方握手建立连接

A.请求端(通常称为客户端)发送SYN段,指示客户端打算连接的服务器端口和初始序列号(在本例中为ISN,1415531521)。这个SYN段是段1。b .服务器发回一个包含服务器初始序列号的SYN报文段(报文段2)作为响应。同时,确认序列号被设置为客户的ISN加1,以确认客户的SYN段。SYN将占用一个序列号。c .客户必须将确认序列号设置为服务器的ISN加1,以确认服务器的SYN段(段3)。这三个部分完成了连接的建立。这个过程也被称为三向三次握手

用wirshark抓住袋子,如下所示:

可以看出,三次握手决定了双方之间的数据包序列号、最大接受数据大小(窗口)和最大分段大小(MSS)。MSS=MTU-IP头-TCP头,MTU代表最大传输单位,一般为1500字节,我们在分析IP头时会讲到。IP头和TCP头都是20字节,可选。在这种情况下,MSS=1500-20 -20=1460。

MSS限制了TCP数据包携带的数据大小,这意味着当应用层通过TCP协议将数据提交到传输层进行传输时,如果应用层的数据被分成几段,MSS必须逐个发送。

例如,应用层一次向传输层提交4096字节的数据。此时,通过wirshark捕获数据包的效果如下:

前三次是三次握手的过程,后三次是传输数据的过程。因为数据大小是4096字节,所以需要三次传输(1448 1448 1200)。细心的人会问为什么每次传输的最大数据量不是1460字节。因为这里的TCP带有选项,所以TCP报头长度=20 ^ 12(可选选项大小)=32字节。这样可以传输的最大数据量为:1500-20-32=1448字节。

(2)挥手四次断开

A.目前的网络通信是基于socket的。当客户端关闭自己的套接字时,内核协议栈会自动向服务器发送一个FIN set包,请求断开连接。我们将首先发起断开请求的一方称为主动断开方。b .服务器收到客人的FIN断开请求后,内核协议栈会立即发送ACK包作为响应,表示已经收到了客户端的请求。c .服务器运行一段时间后,关闭套接字。此时内核协议栈会向客户端发送一个FIN set包请求断开。d .客户端收到服务器的FIN断开请求后,会发送ACK进行回复,表示已经收到服务器的请求。

wirshar的分析如下:

(3)保证3)TCP的可靠性

TCP采用一种称为“带重传的肯定确认”的技术作为提供可靠数据传输服务的基础。该技术要求接收器在接收到数据后向源站发回确认消息ack。发送方保留发送的每个数据包的记录,并在发送下一个数据包之前等待确认信息。发送方在发送数据包的同时还会启动一个定时器,当定时器到时,确认信息还没有到达时,会重新发送刚刚发送出去的数据包。图3-5示出了具有重传功能的肯定应答协议的数据传输,图3-6示出了由分组丢失引起的超时和重传。为了避免网络延迟导致的延迟确认和重复确认,协议规定确认信息应附有数据包序列号,以便接收方能够正确地将数据包与确认相关联。

从图3-5可以看出,虽然网络同时具备双向通信的能力,但是在收到前一个数据包的确认信息之前,必须推迟下一个数据包的传输,因此简单的肯定确认协议浪费了大量宝贵的网络带宽。因此,TCP使用滑动窗口机制来提高网络吞吐量,解决端到端流量控制。

(4)推拉窗技术

滑动窗口技术是带有重传的简单肯定确认机制的更复杂变体,它允许发送者在等待确认消息之前发送多个分组。如图3-7所示,发送方需要发送一个包序列,滑动窗口协议在包序列中放置一个固定长度的窗口,然后发送窗口中的所有包;当发送方收到窗口中第一个数据包的确认信息时,它可以向后滑动并发送下一个数据包。随着确认的到来,窗口正在向后滑动。

二、UDP协议

UDP协议也是传输层协议,无连接,不保证可靠性。它的协议头相对简单,如下:

这里不解释端口号,它和TCP的端口号有相同的含义。

长度占用2个字节,标识了UDP报头的长度。校验和:校验和,包括UDP报头和数据部分。

第三,IP协议

I P是T C P/I P协议家族中的核心协议。所有德州太平洋、德州太平洋、德州太平洋和I G的数据都是以数据报格式传输的。它的特点是:是u n r e l i a b l e (u n r e l I a b l e),这意味着它不能保证I P数据报能成功到达目的地。I P只提供最好的传输服务。如果出现某种错误,比如路由器缓冲区暂时用完,I P有一个简单的错误处理算法:丢弃数据报,然后向源发送I C M P消息。任何需要的可靠性都必须由上层提供(如T C P)。

术语c o n n e c t i o n l e s意味着I P不维护任何关于后续数据报的状态信息。每个数据报都是相互独立处理的。这也表明I P数据报可能会被无序接收。如果一个源向同一个目的地发送两个连续的数据报(首先是A,然后是B),每个数据报都是独立路由的,并且可能会选择不同的路由,因此B可能会在A到达之前到达。

1.IP头格式

(1)版本占用4位,指的是IP协议的版本。双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。IPv6仍处于草案阶段。

(2)报头长度占用4位,可以表示的最大十进制值为15。请注意,该字段表示的数字单位为32位字长(一个32位字长为4字节),因此当IP报头长度为1111(即十进制15)时,报头长度达到60字节。当IP包的报头长度不是4字节的整数倍时,必须用最后一个填充字段填充。因此数据部分总是从4字节的整数倍开始,便于实现IP协议。将报头长度限制为60字节的缺点是有时可能不够。然而,这样做是希望用户能够尽量减少他们的开支。最常用的报头长度为20字节(即报头长度为0101),此时不使用任何选项。

(3)差异化服务占据8个位置,用来获得更好的服务。该字段在旧标准中被称为服务类型,但从未使用过。1998年,IETF将这一领域更名为DS(差异化服务)。此字段仅在使用差异化服务时有效。

(4)总长度总长度是指报头和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。

IP层以下的每个数据链路层都有自己的帧格式,包括帧格式中数据字段的最大长度,称为MTU(MaximumTransferUnit,MTU)。当数据报被封装为链路层帧时,数据报的总长度(即报头加上数据部分)不得超过下一个数据链路层的MTU值。

(5)标识占用16位数字。IP软件在内存中维护一个计数器,每次生成数据报时,计数器都会递增1,并将该值分配给标识字段。但是,这个“ID”不是序列号,因为IP是无连接服务,数据报不是按顺序接收的。当一个数据报由于其长度超过网络的MTU而必须被分段时,该标识字段的值被复制到所有数据报的标识字段中。标识字段的相同值使得分段的数据报片能够最终被正确地重组到原始数据报中。

(6)标志占用3位,但目前只有2位有意义。

标志字段中的最低位被记录为MF(MoreFragment)。MF=1表示在下面的数据报中“有碎片”。MF=0表示这是几个数据报中的最后一个

标志字段中间位标记为DF(Don’t fragment),表示“不能分片”。仅当DF=0时才允许碎片。

(7)芯片偏移占13位。切片偏移量指示在长数据包被切片后,切片在原始数据包中的相对位置。也就是说,相对于用户数据字段的起始点,即切片开始的位置。芯片偏移量以8字节为偏移量单位。也就是说,每个片段的长度必须是8字节(64位)的整数倍。

(8)生存期占用8位,常用的生存期字段英文缩写为TTL(time tolief),表示数据报在网络中的生存期。该字段由发送数据报的源点设置。其目的是防止无法投递的数据报在互联网上无限循环,从而白白浪费网络资源。最初的设计是使用秒作为TTL单位。每次通过路由器时,都会从路由器中数据报消耗的时间中减去TTL。如果数据报在路由器中消耗的时间少于1秒,TTL值将减少1。当TTL值为0时,数据报被丢弃。

(9)协议占用8位,协议字段指示此数据报携带的数据使用哪种协议,以便目的主机的IP层知道应该将哪个处理过程移交给数据部分。

(10)第一个校验和占用16位。此字段仅检查数据报的报头,但不包括数据部分。这是因为每次数据报通过路由器时,路由器都必须重新计算报头校验和(一些字段,如生存时间、标志、片偏移等。可能会改变)。不检查数据部分可以减少计算工作量。

(11)源IP地址占用32位。

(12)目的IP地址占用32位。

2.分段解释

分片是指当要传输的数据大于最大传输单位(MTU)时,需要将其分成多个数据包,然后逐一发送给对方。当我们谈论TCP时,当我们谈论MSS时,许多人无法区分它们。通过下面的图片,我想我们可以完全区分它们。

个人认为,如果数据是通过TCP协议传输的话,说到IP层肯定不需要分片。只有通过UDP协议传输大数据时才需要分片。例如,使用UDP协议传输10240字节的数据

可以看出,当数据提交到网络层时,由于超过了最大传输单位,数据被分段。分成多个数据包,通过IP协议相互发送。每个数据包的最大字节是MTU-IP报头=1500-20=1480。

四.以太网报头

三部分组成了:使用的协议源媒体访问控制地址|目的媒体访问控制地址|。

因此,在以太网中,有几种:数据包格式

ARP协议通过IP地址获取对应的MAC地址,称为地址解析协议

RARP协议通过MAC地址获取对应的IP地址,称为反向地址解析协议

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:tcp、udp、ip协议分析_电源节点Java研究所整理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。