UDP千兆网之TCP/IP协议基础

一、TCP/IP 协议简介

TCP/IP 四层模型分为应用层(Telnet、FTP、SMTP)、传输层(TCP、UDP)、网络层(IP、ARP、ICMP)、数据链路层(MAC、设备驱动)。

数据链路层:又称链路层或网络接口层,是实际网络硬件的接口。包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。定义了如何使用具体网络(如ETH)来传输数据,定义了将数据组成正确帧的规范和在网络中传输帧的规范。帧是指一串数据,它是数据在网络中的传输单位。

网络层:也称互联网层,处理分组在网络中的活动,如分组的路由等。网络层提供了互联网的“虚拟网络镜像”。本层定义了网络中传输的“信息包”的格式,以及从一个终端到达另一个终端的路由转发机制。它负责对数据包进行封装和传输,让每个数据包都能到达目的主机(但不能保证被正确接收)。网络层协议包括IP(网际协议)、ICMP(互联网控制报文协议)、IGMP(互联网组管理协议)、ARP(地址解析协议)、RARP(逆向地址解析协议)等协议。

传输层:为两台主机上的应用程序提供端到端的通信。传输层提供了两种不同的传输服务:TCP(传输控制协议)和UDP(用户数据报协议)。TCP协议是面向连接的,可以提供可靠的数据传输服务,UDP协议是无连接的传输协议,可靠性只能由上层应用保证。

应用层:定义了应用程序使用互联网的规范,负责处理特定的应用程序细节。

 二、TCP/IP 协议通信过程

当主机A的应用程序需要发送数据给主机B时,将需要传输的数据包送入TCP/IP 协议栈进行处理。首先用户数据在传输层进行打包,然后将打包后的传输层报文送给网络层。网络层对传输层的数据包进行打包(添加网络层首部信息),然后将网络层报文(IP数据包)送给数据链路层。数据链路层对IP数据包添加以太网首部和尾部信息,然后送给物理层通过网络发送出去。打包过程如下:

UDP千兆网之TCP/IP协议基础_第1张图片

三、数据链路层

数据链路层处于TCP/IP 协议参考模型的最底层,在TCP/IP协议簇中,链路层主要有三个目的:(1)发送和接收IP数据包(2)发送ARP请求和接收ARP应答(3)发送RARP请求和接收RARP应答。主要负责把上层送来的数据包打包并通过特定的网络发送出去,或者对从网络上接收来的数据包进行解包并校验,然后交给上层。

数据链路层一般可再细分为介质访问控制子层 MAC 和逻辑链路控制子层LLC。MAC 子层的协议实现一般由 MAC 接口芯片来完成;而 LLC 子层的实现一般是由网络接口芯片的驱动程序来完成的。其中 MAC 位于 LLC 和物理层之间,使 LLC 适用于不同的媒体访问技术和物理媒体。MAC 单独作为一个子层,就不会因为媒体访问方法的改变而影响到较高层的协议。

以太网协议是数字设备公司(Digital Equipment Corporation)、英特尔公司(Intel  Corporation)和 Xerox 公司在 1982 年联合公布的标准。它采用一种称为CSMA/CD 的媒体接入方法,即带冲突检测的载波侦听多路接入(Carrier  Sense MultipleAccess/Collision Detection)技术。目前支持的速率有10/100/1000 Mbps。以太网的帧格式如下图所示:

 

UDP千兆网之TCP/IP协议基础_第2张图片  

前导码(Preamble):为实现底层数据的正确阐述,物理层使用7个字节同步码(0和1交替(55-55-55-55-55-55-55))实现数据的同步。

帧起始界定符(SFD,Start Frame Delimiter):使用1个字节的SFD(固定值0xD5)来表示一帧的开始。

目的MAC地址:接收端物理MAC地址,占用6个字节。MAC地址从应用上可分为单播地址、组播地址和广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,引用由标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,用于标志同一网段中的所有设备。

源MAC地址:即发送端物理MAC地址,占用6个字节。

长度/类型:当这两个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;大于1536,则表示该以太网中的数据属于哪个上层协议,0x0800代表IP数据包(网际协议)、0x0806代表ARP数据包(地址解析协议)、0x8035表示RARP数据包等。

数据:以太网中的数据段长度最小46个字节,最大1500个字节。最大值1500成为以太网的最大传输单元(MTU,Maximum Transmission Unit)。

帧检验序列(FCS,Frame Check Sequence):为了确保数据的正确传输,在数据的尾部加入了4个字节的循环荣誉校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始不包括前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC32、CRC-CCIT,其中应用最广泛的是CRC32标准。

以太网相邻两帧之间的时间间隔,即帧间隙(IFG,Interpacket Gap)。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并未下一帧做准备的时间,IFG的最小值是96bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。

10Mbit/s:96*100ns = 9600ns

100Mbit/s:96*10ns = 960ns

1000Mbit/s:96*1ns = 96ns

四、网络层协议

网络层协议主要包括IP、ICMP、ARP等。最核心的是IP协议,所有传输层报文、ICMP报文、IGMP报文都以IP数据报格式传输。网络层为传输层数据提供传输、路由及控制报文生成等服务。

IP协议

IP协议的主要功能是无连接数据包传输、数据包路由、差错处理等。当发送错误时,IP协议会丢弃该数据,然后发送ICMP消息给发送端。

一般情况下IP首部长为20个字节,最高位在左边,记为0bit;最低位在右边,记为31bit。4个字节的32bit值传输次序:首先是0-7bit,其次8-15bit,然后16-23bit,最后是24-31bit。

UDP千兆网之TCP/IP协议基础_第3张图片

IP数据报首部各字段的含义如下:

版本号(Version):4bit,目前常用的协议版本号是4(IPv4)。

首部长度(IHL,Internet Header Length):指IP数据报首部有多少个32bit,包括选项字段。占用4bit,首部长度最大为60个字节。在没有任何选项的情况下,这个字段的值是5。

服务类型(TOS,Type of service):占8bit,包括一个3bit上午优先权子字段(现在已被忽略),4bit的TOS子字段和1bit未用位(置0)。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,即一般服务。目前大多数的TCP/IP协议栈的实现都不支持TOS特性。

总长度(Total Length):指整个IP数据报的长度(包括首部),以字节为单位。由于该字段占16bit,所以IP数据报的最大长度为65535。理论上IP数据报长度可达65535,但由于链路层一般都有做一个最大传输单元(MTU)的限制,一般都会对长度大于MTU的数据包进行分片以适合进行网络传输,分片后总长度字段会自行更新。总长度字段是必不可少的,因为一些数据报为了满足链路层的最小帧长要求,可能会在有效数据后面添加填充码,这样在接收到有填充码的数据报时,需要根据总长度字段提取出有效字段。

标识(Identification):占16bit,用来标识主机发送的每一个数据报。通常每发送一个报文它的值就加1。这个字段在对数据报进行分片和重组时有非常重要的作用。

标志和片偏移(Flags、Fragment Offset):占16bit,前3bit时标志,后面13bit是片偏移。子结构如下:

未用

DF

M

13位片偏移

DF(Don’t Fragment)位是不分片标志,DF=1,指示不能对数据报分片;DF=0,指示可以分片。M位标识该分片是否原来数据报的最后一片,M=1指示该分片不是最后一个分片;M=0指示为最后一个分片。后面13bit指示了该分片在原始数据报中的所处位置的偏移量。

生存周期(TTL,Time to Live):占8bit,是一个用来限制数据报生存周期的计数器。一般一个数据报经过一个路由器,该字段就减1。当TTL字段为0时,路由器就会丢弃该数据报,并发送一个错误信息给源端。

协议(Protocol):占8bit,标识具体传输层协议,如TCP或UDP等。该域时6表示TCP协议;17表示UDP协议;1表示ICMP协议(ICMP协议不属于传输层协议,但是也被封装在IP数据报中传输)。

IP首部校验和(Header Checksum):占用16bit,用来确保数据的正确性。该校验和的计算是通过将首部按16bit相加(首先将该字段置0),超出16bit的部分再与低16bit相加,最后将结果取反码后放入该字段。由于IP首部总长度、TTL等这些字段在传输的过程中可能发生变化,所以任何一个字段发生变化,校验和都需要重新计算。

 

源IP地址(Source Address):32bit源IP地址,即发送端的IP地址。

目的IP地址(Destination Address):32bit目的IP地址,即接收端的IP地址。

可选字段:主要用来进行网络测试,该字段是变长的,定义了5中选项:安全性、严格源路由选择、宽松源路由选择、路由记录、时间标记。以32bit为界,不足时插入值为0的填充字节,保证IP首部是32bit的整数倍。

 

ARP协议

       发送数据时只知道目的主机的IP地址并不知道它的硬件地址。链路层要发送数据时,首先搜索ARP高速缓存,如果其中没有对应的映射记录,就会发送一个ARP请求,接收到该请求的机器检查数据包中目的IP地址,若与自身的IP地址匹配,就会回复一个ARP应答,本地主机接收到这个应答包后就可以知道目的主机的硬件地址,然后就可以发送数据。同时还会更新本机的ARP高速缓存。ARP数据报格式如下:

以太网首部

硬件类型

 

协议类型

 

硬件地址长度

协议地址长度

操作码

发送端以太网地址

发送端IP地址

目的端以太网地址

目的端IP地址

 

2

2

1

1

2

6

4

6

4

 

ARP请求/应答(28字节)

       以太网目的地址全是广播地址,例如发送ARP请求时以太网目的地址就是广播地址。

       硬件类型字段标识硬件地址的类型。值为1标识以太网地址。协议类型标识要映射的协议类型。值0x0800表示IP协议。它的值与包含IP数据报的以太网数据帧中的类型字段相同。

硬件地址长度:对于以太网上IP地址的ARP应答或请求,值为6。

协议地址长度:对于以太网上IP地址的ARP应答或请求,值为4。

操作码字段表示四种操作类型:ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)、RARP应答(值为4)。

RARP协议报文格式与ARP基本一致。主要差别是RARP请求或应答的帧类型字段为0x8035,操作码字段RARP请求时3,RARP应答是4。

ICMP协议

       数据包在传输过程中可能要经过多个路由器,如果路由器不能转发或检测到一个不正常的状态,路由器就要向源端报告,以便采取措施避免或解决问题。ICMP协议就提供了这种机制,它主要包含下列几种类型的消息:

       目的不可达消息用来报告子网或者路由器没有找到目的地,或者设置了DF标志的数据报不能通过MTU小的网络。

       超时消息用来报告分组由于TTL为0而被丢弃。

       参数问题消息表明首部字段不正确,可能是发送主机或路由器软件有问题。

       源抑制消息希望发送端主机能够降低发送速率。

       重定向消息在路由器发现可能出现路由错误时发送。

回显请求和应答消息用来测试目的地是否可达并且正常工作。

时间戳请求和应答与回显请求消息类似,只要是记录消息到达和发出的时间,用于测试网络性能。

五、传输层协议

传输层协议有UDP(用户数据报协议)和TCP(传输控制协议)。

UDP协议是一个简单的面向数据报的传输层协议,提供不可靠的传输层服务。只负责将应用数据打包交给网络层,但是不保证数据报能正确到达,所以需要应用程序来保证其可靠性。UDP数据报格式如下:

UDP千兆网之TCP/IP协议基础_第4张图片

端口号用来标识发送进程和接收进程。UDP根据目的端口号来决定将接收到的数据交给哪个应用进程。

UDP长度字段指示整个UDP数据报的长度,包括UDP首部和数据。由于UDP首部长度是8字节,所以UDP长度字段最小为8(无数据时)。UDP长度是有冗余的,IP数据报首部的总长度字段包括IP首部和数据,因此这个数据报长度可以用IP总长度减去IP首部长度。

UDP校验和是一个端到端的校验和。由发送端计算,然后由接收端验证。目的是检查数据在传输过程中是否被改变。这个字段是可选的,但应该总被使用。如果发送的数据报的校验和为0,则说明发送端没有计算校验和。

UDP校验和覆盖UDP首部和数据。UDP数据报的长度可以是奇数字节,但是校验和算法是把若干个16bit相加。解决方法是必要时在最后增加填充字节0,这只是为了校验和的计算(可能增加的填充字节不被传输)。其次,UDP数据报校验和的计算包含一个12字节长的伪首部,它是为了计算校验和而设置的。伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址(4字节),目的IP地址(4字节),协议类型(2字节)和UDP长度(2字节),其目的是让UDP两次检查数据是否已经正确到达目的地,姿势单纯为了做校验用的。在大多数场景下接收端并不检测UDP检验和。

想要获取更多的教程和资料,请关注我的微信公众号:深入浅出玩儿转FPGA(fpgafun),获取更多好玩实用的资料哦!

你可能感兴趣的:(FPGA)