逐步深入TCP/IP协议栈
Posted Xiao__Tian__
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逐步深入TCP/IP协议栈相关的知识,希望对你有一定的参考价值。
一、关于应用层用户数据的历程,见下图:
TCP/IP数据包的封装
过程:应用层将数据通过协议栈逐层向下传递,其下的每层接到来自上层的数据时,根据每层的协议都要在其数据
的前端添加首部信息进行封装。不同的协议层对数据包有不同的称谓,在传输层叫做数据段,在网络层叫做数据报,
在链路层叫做数据帧。在经过链路层时,数据已经封装成帧并递交给物理层的传输介质上,到达目标主机后,同理每
层协议在逐层剥掉其首部,最后递交给目标主机应用层的数据与源主机发送的数据一致。
注:对于有效数据称之为“有效载荷”,添加的部分称其为“报头”,下层收到来自上层交付的数据时,对于下层来
说并不关心其具体内容,因为站在当前层的角度来看,此时已添加上层报头信息的数据整个都被视为有效载荷,当前
层要做的只是继续封装该数据,即添加自己的报头。而解包的过程亦是如此,每层只负责剥离自己能识别的报头信
息。任何数据报中的报头信息必须包含"上层协议",即要把当前的有效载荷交付给上层的谁谁谁。
二、上图适应两台计算机在同一网段的情况,如果是不同网段,从源主机到目标主机间的数据传输则须经过一个或多
个路由器,以实现数据的跨网络传输。
注:路由器是工作在第三层的网络设备,同时兼有交换机的功能,可以在不同的链路层接口之间转发数据包。因此路由
器需要将进来的数据包拆掉网络层和链路层两层首部并重新封装。
三、以太网帧格式
帧格式:其中源地址和目的地址指的是网卡的硬件地址(也就是MAC地址),长度为12个字节(48位),由生产
厂家烧制具有唯一性的地址标识,出厂时既已固化。在centos下利用config命令可以查看MAC地址。帧协议类型包
括了IP、ARP、RARP这三种协议,其类型值分别为0800的IP协议,0806的ARP协议,0835的RARP协议。而后
是有效载荷的大小(数据长度),最后是CRC校验码,用于差错校验的。
注:HWaddr则为MAC地址。
有效数据:以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在
后面补填充位。最大值1500称为以太网的最⼤大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从
以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。ifconfig
命令的输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。
四、CSMA/CD(冲突检测载波监听多路访问技术)
以太网协议是一个比较大的概念,其包括了MAC(介质访问控制)协议、IP协议,ARP协议、RARP协议。
在传统的共享以太网中,所有的节点共享传输介质。如何保证传输介质有序、高效地为许多节点提供传输服务,就是
以太网的介质访问控制协议要解决的问题。其底层基于CSMA/CD技术的实现,可以用于判断数据的发送时机。
解释:所谓载波侦听,意思是网络上各个工作站在发送数据前都要侦听总线上有没有数据传输。若有数据传输 (称
总线为忙碌状态),则不发送数据;若无数据传输(称总线为空闲状态),立即发送准备好的数据。所谓多路访问意
思是网络上所有工作站收发数据共同使用同一条总线,且发送数据是广播式的。所谓冲突,意思是若网上有两个或两
个以上工作站同时发送数据,在总线上就会产生信号的混合,两个工作站都同时发送数据,在总线上就会产生信号的
混合,两个工作站都辨别不出真正的数据是什么,这种情况称数据冲突又称碰撞。为了减少冲突发生后的影响。工作
站在发送数据过程中还要不停地检测自己发送的数据,有没有在传输过程中与其它工作站的数据发生冲突,这就是冲
突检测。
★要解决在公共通道上以广播的方式发送数据时的问题(主要是数据碰撞),该技术要做的工作有监听,发送,检
测,冲突处理。
其过程为发送数据前,先监听总线是否空闲。若总线忙,则不发送。若总线空闲,则把准备好的数据发送到总线上。在发送数
据的过程中,工作站边发送边检测总线,是否自己发送的数据有冲突。若无冲突则继续发送直到发完全部数据;若有冲突,则立即
停止发送数据,但是要发送一个加强冲突的JAM信号,以便使网络上所有工作站都知道网上发生了冲突,然后,等待一个预定的随
机时间,且在总线为空闲时,再重新发送未发完的数据。概括来讲就是:先听后发,边发边听,冲突停发,延迟重发(随机的)。
★其优点原理简单,技术性较易,网络中个工作站处于平等的地位,不需要集中控制,没有优先级控制;其缺点是一
旦网络负载较大时,数据的发送时间会增长,其发送效率会急剧下降。
五、ARP协议
作用:在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先
是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获
得目的主机的硬件地址。ARP协议就起到这个作用。
解释:ARP协议原名为“地址解析协议”,是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含
目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该
IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
注:源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如
果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类
型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表⽰示ARP请求,op字
段为2表示ARP应答。
六、RARP协议
RARP协议:原名为“反向地址解析协议”,允许局域网的物理机器从网关服务器的ARP表或者缓存上请求其IP地
址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的IP地址。当设置一台新的
机器时,其RARP客户机程序需要向路由器上的 RARP 服务器请求相应的IP地址。假设在路由表中已经设置了一个记
录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。
产生原因:ARP(地址解析协议)是设备通过自己知道的IP地址来获得自己不知道的物理地址的协议。假如一个设备
不知道它自己的IP地址,但是知道自己的物理地址,设备知道的只是网络接口卡上的物理地址时,又该怎么办呢? 为
解决这种情况,就有了与ARP对应的RARP协议。
工作方式:RARP以与ARP相反的方式工作。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包
括由能够提供所需信息的RARP服务器发出的IP地址。虽然发送方发出的是广播信息,RARP规定只有RARP服务器
能产生应答。许多网络指定多个RARP服务器,这样做既是为了平衡负载也是为了作为出现问题时的备份。
七、IP协议
先来看看IP数据报的格式,见下图:
注:IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。对于IPv4 ,4位版本字段是4。4位首部长度
的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节, 也就是不带任何选项的IP首部,4位能表
示的最大值是15,也就是说首部长度最大是60字节。8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不
用),还有4个位表⽰示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。
16位总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传⼀一个IP数据报,16位的标识加1,可用于分片
和重新组装数据报。3位标志和13位片偏移用于分片。TTL(Time to live)是这样用的:源主机为数据包设定一个生存时
间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因
此 这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,
只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。
关于IP地址对于网络的划分,在此不再介绍,将会在后续博文中予以介绍。
IP与路由:
★路由表:由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接口发送,其中最后一条是缺省路
由条目。路由条目路由表中的一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如
果要发送的数据包的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。缺省路由条目路由表中
的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规
定的接口发送到下一跳地址。
★路由是从寻找目标网络开始的,对于路由来说其找寻目标网络地址一般有三种可能:1、知道,但当前网段找不到
(送至下一路由);2、不知道,也找不到。(送至默认网关);3、知道,也能在当前网段找到。
★路由如何确定要发送的网络号?
IP数据报中存有目标IP地址,所以当路由获得该地址时,通过与子网掩码的“与”操作,便能得到一个网络号,将其
与路由表中的目标地址(Destination)条目进行逐一比对,如果比对成功则通过该网络号对应的发送接口(Use
Iface)发出;若未匹配到,则说明不在该局域网络,须将其从eth0的发送接口发出,将其送至默认网关处,再由其路
由表决定下一跳的地址。
八、UDP协议
UDP协议:UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在
OSI模型中,在第四层的传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的
缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数
据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从
问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一
项非常实用和可行的网络传输层协议。
注:UDP协议不面向连接,也不保证传输的可靠性,例如: 发送端的UDP协议层只管把应用层传来的数据封装成段交给
IP协议层就算完成任务了,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。接收
端的UDP协议层只管把收到的数据根据端口号交给相应的应用程序就算完成任务了,如果发送端发来多个数据包并且
在网络上经过不同的路由,到达接收端时顺序已经错乱了,UDP协议层也不保证按发送时的顺序交给应用层。通常接收
端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用程序来提取和处理,如果应用程序提取和处理的
速度很慢,而发送端发送的速度很快,就会丢失数据包,UDP协议层并不报告这种错误。因此,使用UDP协议的应用程序
必须考虑到这些可能的问题并实现适当的解决方案,例如等待应答、超时重发、为数据包编号、流量控制等。一般使用
UDP协议的应用程序实现都比较简单,只是发送一些对可靠性要求不高的消息,而不发送大量的数据。例如,基于UDP的
TFTP协议一般只用 trivial ftp TCP FTP于传送小文件,而基于TCP的协议适用于各种文件的传输。
UDP协议的特点:UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提
供报文到达确认、排序、及流量控制等功能。
九、TCP协议
TCP段格式
TCP协议:应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报
文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由
它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了
传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实
体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验
和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
★注:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信
协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协
议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层
之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流
机制,而是提供不可靠的包交换。
★提起TCP,就不得不提及TCP的三次握手和四次挥手,其过程见下图用例:
★注:三次握手可概括为,请求连接,收到应答,再次请求。 SYN ----> SYN --------> ACK。
四次挥手可概括为,主动请求释放,主端收到应答,对端请求释放,对端收到应答。 FIN---------
>ACK-------->FIN--------->ACK。
★三次握手完后的数据传输也是基于请求应答模式的,从而很好的解决了丢包问题。
★为何要四次挥手呢?答:四次挥手:连接释放。在创建连接时,发送端和接收端分别建立连接并以相应的数据结构
进行建立维护,在一定程度上两端处于一个对等的关系。当一放释放连接时,并不能保证对端数据是否发送完毕,所
以需要进行释放连接的请求,等待对端确认,所以一来一回,共四次。
可以看出:TCP协议是面向字节流的,是一种流式服务,全双工的。本端发送和接受数据两不误。
以上是关于逐步深入TCP/IP协议栈的主要内容,如果未能解决你的问题,请参考以下文章
002::每天五分钟入门TCP/IP协议栈::IP协议之IP首部长度问题