Linux网络编程 | 【第一篇】网络协议详解

前言

一、协议

1.1 基本概念

从应用的角度出发,定义为数据传输数据解释的规则;

常见协议:httptcp

1.2 典型协议

  • 传输层:TCP/UDP;

  • 应用层:HTTP、FTP;

  • 网络层:IP、ICMP、IGMP;

  • 网络接口层:ARP、RARP;

  • TCP:传输控制协议,面向连接的、可靠的、基于字节流的传输层通信协议;

  • UDP:用户数据报协议,OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传输服务;

  • HTTP:超文本传输协议,最为广泛的网络协议;

  • FTP:文件传输协议;

  • IP:因特网互联协议;

  • ICMP:为Internet控制报文协议,是TCP/IP的子协议,用于IP主机、路由器之间传递控制消息;

  • IGMP:Internet控制报文协议,运行在主机和组播路由器之间;

  • ARP:正向协议解析,通过已知的IP,寻找对应主机的MAC地址;

  • RARP:反向地址转换协议,通过MAC地址确定IP地址;

二、网络应用程序设计模式

2.1 C/S模式

传统的【客户端/服务器】模式,需要在通讯两端各自不是客户机和服务器来完成通信;

优点

  • 客户端位于目标主机上,保证了性能,能缓存数据,提高数据传输效率;
  • 可自定义协议;

缺点

  • 开发工作量大;
  • 对用户隐私安全性构成威胁;

2.2 B/S模式

【浏览器/服务器模式】,只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可;

优点

  • 开发量较小;
  • 不受平台限制;

缺点

  • 网络应用支持受限;
  • 协议选择不灵活;

三、分层模型

在这里插入图片描述

3.1 OSI 七层模型

在这里插入图片描述

物理层

* 主要定义物理设备标准;
* 主要作用是传输比特流(数模互转)

数据链路层

* 定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问;
* 主要作用提供错误检测和纠正,以确保数据的可靠传输;

网络层

* 位于不同地理位置的网络中的俩个主机系统之间提供连接和路径选择;
* 提高用户的访问数;

传输层

* 定义了一些传输数据的协议和端口号;
* 主要作用将从下层接收的数据进行分段和传输,到达目的地后在重组(段数据);

会话层

* 通过传输层建立数据传输的通路;
* 主要在你的系统之间发起会话或者接受会话请求;

表示层

* 可确保一个系统的应用层所发送的信息可被另一个系统的应用层读取;
* 表示层会通过使用一种通格式来实现多种数据格式之间的转换;

应用层

* 最靠近用户的OSI层;
* 主要作用为用户的应用程序提供网络服务;

3.2 TCP/IP四层模型

在这里插入图片描述
应用层

Telnet、FTP、email等;

传输层

TCP、UDP

TCP简述

  • TCP是一种面向连接的、可靠的协议,类似打电话,电话互通即建立了连接,然后说话就行了,这边说的话那边保证听得到,并且是按顺序,挂机断开连接;
  • TCP传输的双方需要首先建立连接,之后由TCP协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可靠的数据流,通讯之后关闭连接。

UDP简述

  • UDP是无连接的传输协议,不保证可靠性,类似寄信,信放到邮筒,既不能保证信件在邮递过程中不会丢失,也不能保证信件寄送顺序。使用UDP协议的应用程序需要自己完成丢包重发、消息排序等工作。

网络层

IP、ICMP、IGMP

链路层

设备驱动程序及接口卡

四、网络之间如何进行通信

4.1 计算机通过TCP/IP,在同一网段中通信过程

在这里插入图片描述

4.2 计算在不同网段中,经过路由器的过程

在这里插入图片描述

链路层

  • 以太网令牌环网等标准,链路层负责网卡设备的驱动帧同步(即从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。
  • 交换机是工作在链路层的网络设备,可以在不同的链路层网络之间转发数据帧(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间),由于不同链路层的帧格式不同,交换机要将进来的数据包拆掉链路层首部重新封装之后再转发。

网络层

  • 网络通过IP地址来标识,Inter-net上有大量路由器负责根据IP地址选择合适的路径转发数据包,数据包从Internet上的源主机到目的主机往往要经过十多个路由器。
  • 路由器是工作在第三层的网络设备,同时兼有交换机的功能,可以在不同的链路层接口之间转发数据包,因此路由器需要将进来的数据包拆掉网络层链路层两层首部并重新封装。IP协议不保证传输的可靠性,数据包在传输过程中可能丢失,可靠性可以在上层协议或应用程序中提供支持。
  • 主要负责点(主机)到点(路由器)的传输

传输层

  • 主要负责端(主机)到端(目的主机)的传输;

4.3 目的主机收到数据包,如何经过各层协议栈后到达应用程序呢?

在这里插入图片描述

以太网驱动程序首先根据以太网首部中的上层协议字段确定该数据帧的有效载荷(除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,再交给相应的协议处理。

  • 若是IP数据报,IP协议再根据IP首部中的上层协议字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP,然后交给相应的协议处理;
  • 若是TCP段或UDP段,TCP或UDP协议再根据TCP首部或UDP首部的端口号字段将应用层数据交给用户进程。端口号就是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程;
  • 虽然IP、ARP和RARP数据报都需要以太网驱动程序来封装成,但是从功能上划分,ARPRARP属于链路层IP属于网络层
  • 虽然ICMP、IGMP、TCP、UDP的数据都需要IP协议来封装成数据报,但是从功能上划分,ICMP、IGMP与IP同属于网络层,TCP和UDP属于传输层。

五、协议格式

5.1 数据包是如何进行封装

传输层及其以下的机制由内核提供,应用层用户进程提供,应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,称为封装

在这里插入图片描述

  • 不同的协议层对数据包有不同的称谓,在传输层叫做,在网络层叫做数据报,在链路层叫做
  • 数据封装成后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

5.2 以太网格式

在这里插入图片描述

  • MAC地址源地址目的地址是指网卡的硬件地址,长度是48位,是在网卡出厂时固化的。可在shell中使用ifconfig命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP,帧尾是CRC校验码。
  • 以太网帧:以太网帧中的数据长度规定46~1500字节,ARPRARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片(fragmentation)。ifconfig命令输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。

5.3 ARP数据报格式

通信时,不知道目的主机的硬件地址?

  • 在网络通讯时,源主机的应用程序需要目的主机的IP端口号,若不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议,若接收到的数据包的硬件地址与本机不符,则直接丢弃。故在通讯前必须获得目的主机的硬件地址。

该如何解决这一问题呢?

  • 通过使用ARP协议可以,源主机发出ARP请求,询问“IP地址是xxx.xxx.xxx.xxx的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。

ARP缓冲表会过期

  • 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,需要再次发送ARP请求获得目的主机的硬件地址。

在这里插入图片描述
ARP如何进行请求

  • 源MAC地址目的MAC地址在以太网首部ARP请求中各出现一次,对于链路层以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
  • 硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节);
  • op字段为1表示ARP请求,op字段为2表示ARP应答
  • 以太网首部:目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。

5.4 IP段格式

在这里插入图片描述

IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍

  • 对于IPv4,4位版本字段是4;
  • 4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节
  • 8位TOS字段3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型,还有一个位总是0;
  • 总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报
  • 3位标志13位片偏移用于分片。
  • TTL:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)
  • 协议字段指示上层协议是TCPUDPICMP还是IGMP。然后是校验和只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位

5.5 UDP数据报格式

在这里插入图片描述

UDP协议不面向连接,也不保证传输的可靠性例如:

  • 发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协议层即可,若因网络故障该段无法发到对方,【UDP协议层也不会给应用层返回任何错误信息】;
  • 接收端的UDP协议层把收到的数据根据端口号交给相应的应用程序即可,若发送端发来多个数据包并且在网络上经过不同的路由,到达接收端时已乱序,【UDP协议层也不保证按发送时的顺序交给应用层】;
  • 通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用程序来提取和处理,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据包,【UDP协议层并不报告这种错误】。

故在使用该协议时该如何避免以上情况的发生呢?

使用UDP协议的应用程序必须考虑到以上问题并实现适当的解决方案,例如【等待应答、超时重发、为数据包编号、流量控制】等。一般使用UDP协议的应用程序实现都比较简单,只是发送一些对可靠性要求不高的消息,而不发送大量的数据。例如,基于UDP的TFTP协议一般只用于传送小文件(所以才叫trivial的ftp),而基于TCP的FTP协议适用于各种文件的传输;

5.6 TCP数据报格式

在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值