Linux学习之旅(25)-----网络协议

网络协议报文格式

一、应用层

1、超文本传输协议(HTTP)

报文格式:HTTP的报文有两类:请求报文和响应报文。

请求报文-----从客户向服务器发送请求报文。

Linux学习之旅(25)-----网络协议_第1张图片

 响应报文-----从服务器到客户的回答。

Linux学习之旅(25)-----网络协议_第2张图片

 从上图中我们就可以看出HTTP的报文(请求和响应)都是由三部分组成的。两个报文的差别就是请求行不同。

开始行:用于区别是请求报文还是响应报文,在开始行中三个字段都使用空格隔开,最后使用CRLF回车换行。

首部行:用来说明浏览器的、服务器或报文主体的信息。

实体主体:在请求报文中通常不同,而在响应报文中也可能不用。

请求报文中常见的几种方法:

方法(中文意思) 意义
OPTION(选项) 请求一些选项的信息
GET(获取) 请求读取由URL所标志的信息
HEAD(头) 请求读取由URL所标志的信息的首部
POST(张贴) 给服务器添加信息(eg:注释)
PUT(放) 在指明的URL下存储一个文档
DELETE(删除) 删除指明的URL所标志的资源
TRACE(跟踪) 用来进行环回测试的请求报文
CONNECT(连接) 用来代理服务器

响应报文状态码:

常见的状态码:202表示接受,400表示错误请求,404表示找不到指定的网址,301表示转移为新的网址。

状态码是由三位数字组成的,原先由33个,后来又新加了几个。共分为5类,不同开头表示不同的意义:

(1)1XX:表示通知信息,如完成请求正在处理。

(2)2XX:表示成功,如接收。

(3)3XX:表示重定向,如要完成请求还必须采取进一步的行动。

(4)4XX:表示客户端的差错,如请求中有错误语法或者不能完成。

(5)5XX:表示服务器的差错,如服务器失效无法完成请求。

二、运输层

1、用户数据包协议UDP(User Datagram Protocl)

UDP的主要特点:

(1)UDP是无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。

(2)UDP使用尽最大努力交付,即不保证可靠的交付,因此不需要维持复杂的连接状态。

(3)UDP是面向报文的。UDP除了会在数据上加上UDP的首部之外,再不会数据做任何处理。即不合并,也不拆分。如果数据过长,UDP会交给IP层,由IP进行分组,这样会降低IP层的效率。

(4)UDP没有拥塞控制,因此当网络环境不好时,对UDP的效率影响并不大,很适合用于实时通讯。

(5)UDP支持一对一、一对多、多对一、多对多的交互通信

(6)UDP的首部开销小

UDP首部:

UDP的首部只有8个字节,每个字段占两个字节。

(1)源端口:源端口号,在需要对方回信时选用。不需要时可用全0。

(2)目的端口:目的端口号,在终点交付报文时必须使用。

(3)长度:UDP用户数据包的长度,包括UDP本身的长度,最小为8.

(4)校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。(UDP为了计算校验和专门在UDP数据报之间加了一个12个字节的伪首部,伪首部既不向下传递也不向上递。)

UDP伪首部:

2、传输控制协议TCP(Transmission Control Protocol)

TCP的主要特点:

(1)TCP时面向连接的运输层协议。即应用再适应TCP协议进行通信时,必须先建立TCP连接。在传送数据完毕之后,必须释放已经建立的连接。

(2)每一条TCP连接只能有两个端点,每一条TCP连接只能时点对点的(一对一)。

(3)TCP提供全双工通信。即TCP允许通讯的双方随时发送数据,TCP连接的两端都设有“收、发缓冲区”,所以的数据都是存放在缓冲区,然后等待合适的时候读取或发送。

(4)TCP提供可靠交付的服务。通过TCP连接传输的数据,无差错、不丢失、不重复,并且按序到达。

(5)TCP是面向字节流的。即如果应用交下来10个较小(字节数)的数据包,通过TCP协议传输后,接收方可能只会接收到4个较大的数据包。从内容上看应用的10个数据包和接收方接收到的4的数据没有任何区别,这样就可以保证IP层接收的包的大小是合适的,从而提高了IP的效率。

TCP首部:

Linux学习之旅(25)-----网络协议_第3张图片

TCP首部长度不固定最少20个字节,最大60个字节。

(1)源端口号和目的端口号:各占8位,2个字节,和UDP的端口号作用相同。

(2)序号:占32位,4个字节。序号范围位[0~(2^23)-1],共有2^23个序号,当序号增加到(2^23)-1时,下一个序号就从0开始,即使用mod 2^23的算法。TCP时面向字节流的,因此TCP连接中传送的字节流中的每一个数据都是按顺序编号的。假设序号的值位301,数据的长度位200。这说明,本报文段的第一个字节的编号为301,最后的一个字节的编号为500,如果由下一段报文,那么序号的值为501。

(3)确认号:占32位,4个字节。表示期望收到对方下一个报文段的第一个数据字节的序号。例如:A向B发送了序号值位301,数据长度为200的报文端,这表明从301到500这200个字节已经被B正确的接收,这时的确认号就应为501,表示下一个数报应该从501开始接收。确认号为N,即表明到序号N-1为止的所有字节都已经被正确收到。

(4)数据偏移:占4位。表示TCP报文段的数据起始处距离TCP报文端的起始处的距离。即表示的为TCP首部的长度,因为TCP首部存在可选项,所以其首部的长度的并不确定。因为数据偏移占4个字节,所以可以表示的最大值为15,且数据偏移的单位为4字节。所以TCP首部最长可以由60(15*4)个字节,即选项的最大长度为40个字节。

(5)保留:占6位,为以后使用。

(6)6个控制位,用来说明本报文段的性质。

URG:紧急。当URG=1时,表明紧急指针有效。告诉系统此报文中有紧急数据,需要尽快发送,需要和紧急指针配合使用。

ACK:确认。仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所以的报文段都必须将ACK置为1。

PSH:推送。当接收方收到PSH=1的报文段时,需将接收的消息尽快的交付给应用层,不再等待缓冲区满才向上交付。

RST:复位。当RST=1时,表明TCP连接中出现了严重的差错,必须释放连接,然后重新建立运输连接。RST置1还用来拒绝一个非法报文段或无法打开的连接。

SYN:同步。在建立连接时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。当SYN=1而ACK=1时,表明这时一个连接接收报文。

FIN:终止。用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据以发送完毕,并要求释放运输连接。

(7)窗口:占16位,2个字节。表示范围为[0~(2^16)-1]。窗口是指发送本报文段的一方的接收窗口。窗口值的意义是:告诉接收方,从本报文段的确认号算起,自己(消息的发送者)的接收窗口允许对方发送的数据量(接收方的数据缓冲区有限)。窗口值作为让接收方(本次的发送方)让发送方(本次的接收方)设置其发送窗口的依据。窗口值明确的指出了现在允许发送的数据量,这个值常是在不断变化的。

(8)校验和:占16位,2个字节。校验和字段校验的部分为首部和数据两部分。在计算校验和时,TCP也会在报文端前加上12个字节的伪首部。伪首部的格式和UDP的相同,不过需要将信息修改为TCP的信息,比如协议版本号,数据长度等。

(9)紧急指针:仅当URG=1时,紧急指针才能生效,表示的是本报文段中紧急数据的字节数。因为紧急数据是插在普通数据的最前面的,两者是紧挨着的。(*当窗口值为0时,任然可以发送紧急数据)

(10)选项:长度可选,最大可达40个字节。当没有使用选项时,TCP首部的长度为20个字节。

(11)填充:使得整个TCP首部长度为4字节的整数倍。

在运输层除了UDP和TCP协议还新加了一种控制协议-------流控制传输协议SCTP(Stream Control Transmission Protocol),它具有TCP和UDP协议的公共的优点,可支持一些新的应用,如IP电话。

三、网络层

在网络层采用的设计思路是:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报(IP数据报)服务,网络层不提供服务质量的承诺。网络成最重要的协议就是IP协议,同时配合使用的还有3个,分别为:地址解析协议ARP、网际控制报文协议ICMP、网际组管理协议IGMP

IP层的主要作用:

(1)数据传输:将数据从一台主机传输到另一台主机。

(2)寻址:根据子网划分和IP地址,发现正确的目的主机地址。

(3)路由选择:选择数据在互联网上的传送路径。

(4)数据报文的分段:当传送的数据大于MTU(MTU=1500)时,将数据进行分段发送和接收并组装。

1、地址解析协议ARP(Address Resolution Protocol)

作用:从网络层是使用IP地址,解析出在数据链路层使用的MAC地址。

Linux学习之旅(25)-----网络协议_第4张图片

2、网际协议IP(Internet Protocol)

Linux学习之旅(25)-----网络协议_第5张图片

(1)版本:占4位,指IP协议的类型,通讯双方使用的协议必须一致。

(2)首部长度:占4位,单位为4个字节。所以IP首部的长度最大为60个字节。可变长度最大为40个字节。

(3)区分服务:占8位,也被称为服务类型。用来获取更好的服务。

(4)总长度:占16位,表示以字节为单位的数据报文的长度,包括IP首部和数据部分。IP数据报的最大长度为65535(2^16-1)个字节,但在实际的传输中时很少用到的。

(5)标识:占16位,用于数据报接收后的组装。因为在数据链路层规定了数据报的最大长度位1500(MTU),所以当数据报的长度大于MTU时,就需要进行分片,但IP又是无连接的,不能保证数据报是按顺序过去的,所以就增加了标识段,保证数据报可以被正确的组装。

(6)标志:占3位,但目前只有两个有意义。

标识最低为记为MF(More Fragment)。MF=1即表示后面还有分片的数据报。MF=0表示这已经是最后一个数据报。

标识的中间一位记为DF(Don't Fragmnet)。当DF=1时,表示该数据报不能分片,只有刚DF=0时,才允许分片。

(7)片偏移:占13字节。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节位偏移单位,即每个分片的长度一定是8字节的整数倍。

(8)生存时间(TTL):TTL(Time To Live)字段的值表示数据报文最多可以经过路由器的数量。源主机发送数据时设置TTL(一般为32或64),每经过一个路由器TTL的值减1。当TTL等于0时,路由器丢弃此包,并发送ICMP报文通知源主机。

(9)协议:占8位,协议字段指出此数据报携带的数据使用的何种协议,以便目的主机的IP层知道将数据部分上交给那个协议处理。

常见的协议和协议字段值:

协议名 ICMP IGMP

IP

TCP

EGP

IGP UDP IPV6 ESP OSPF
协议字段值 1 2 4 6 8 9 17 41 50 89

(10)首部校验和:占16位。这个字段只校验数据报的首部,但不包括数据部分。因为IP的首部在路由器上传输时,每经过一个路由器首部都有可能发生变化,如果校验加上数据的话,就会增加数据在传输过程中的负担。

(11)源地址:发送主机的IP地址。目的地址:接收主机的IP地址。用于识别internet上的主机。

3、网际控制报文协议ICMP(Internet Control Message Protocol)

Linux学习之旅(25)-----网络协议_第6张图片

ICMP报文类型有两种,即ICMP差错报告报文ICMP询问报文

常见的ICMP报文类型:

ICMP报文种类 类型的值 ICMP报文的类型
差错报告报文 3 终点不可达
11 时间超过
12 参数问题
5 改变路由(重定向)
询问报文 0或8

回送(Echo)请求或回答

13或14 时间戳(Timestamp)请求回答

ICMP差错控制报文:

(1)终点不可达  当路由器或者主机不能交付数据报时就向源点主机发送终点不可达报文。

(2)时间超过      TTL=0时,路由器向源主机发送。

(3)参数问题       当路由器或目的主机收到的数据报的首部中有字段的值不正确时,就丢弃此包,并向源点发送参数问题报文

(4)改变路由       路由器将改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器。

ICMP询问报文:

(1)回送请求和回答:ICMP回送请求报文时由主机或路由器向一个特定的目的主机发送的询问。收到此报文的主机必须给源主机或路由器发送ICMP会送回答报文。可以用来测试目的站是否可达以及了解其有关状态

ping命令:ping(Packet InterNet Groper)命令是ICMP协议一个重要的应用,用来测试两台主机之间的连通性。使用了ICMP的回送请求和回答报文。ping是从应用层直接使用网络层的,没有通过运输层。

(2)时间戳请求和回答:ICMP时间戳请求和回答报文是请某台主机或路由器回答当前日期和时间。用于时钟同步和时间测量

四、数据链路层

数据链路层是由逻辑链路控制LLC(Logical Link Control)子层媒体接入控制MAC(Medium Access Control)子层。

1、MAC帧格式:

Linux学习之旅(25)-----网络协议_第7张图片

 

(1)目的地址和源地址:目的主机和源主机的的MAC地址(物理地址)。6个字节,48位。

(2)类型:用来标识上一层使用的协议。0800为IP协议,0806为ARP协议。

(3)以太网规定帧的数据长度46-1500之间。

(4)FCS:为帧检验序列,一般使用CRC校验。

为什么帧间最小数据长度为46个字节?

每一个主机在自己发送数据后的一小段时间内,存在着遭遇碰撞的可能性。这一段时间就被称为争用期,又被称为碰撞窗口。一旦数据经过争用期这一段时间,还没有检测到碰撞,就能肯定这一次发送不会发生碰撞。在CSMA/CD(载波监听多点接入/碰撞检测)协议中规定基本的退避时间为2\tau,具体时间为51.2us,对于10Mbit/s的以太网,在争用期可以法512bit,即64个字节。如果数据长度小于64那么,将无法检测出数据是否发生冲突,所以以太网规定凡是小于64个字节的帧都是由于冲突而异常中断的无效帧。有因为MAC帧的首部和尾部一共需要18个字节,所以帧间最小长度为64-18=46字节。而MTU是以太网规定的没有什么特殊的意义,可能是传输效率比较好。

你可能感兴趣的:(linux学习之旅)