最近与网络协议相关的工作使我有机会了解有关网络协议的更多信息。长期以来,我对网络协议的理解一直处于相对较浅的水平。
例如:TCP是面向连接的,可靠的传输,UDP是非连接的,不可靠的传输,TCP连接需要3次握手,这将导致延迟和UDP更快。
例如:套接字编程,服务器套接字创建,绑定,监听,接受,读/写,关闭/关闭,客户端套接字创建,连接,读/写,关闭/关闭,加上epoll /选择这几个。
另一个例子:我知道网络编程应该忽略SIGPIPE信号或者它会挂起,读取返回0意味着对等体是主动关闭的,非阻塞读取应该放在循环中以考虑返回值,多路复用和阻塞,非阻止差异。
TCP/UDP之间的区别,我理解这一点:从北京到杭州,TCP相当于修复高速铁路线(建联)然后开通交付(转移数据),而UDP相当于发送快递,丢失无论如何(直接转移数据)。
以上理解是对的吗?这可能是对还是错。对于应用程序员来说,有了上述理解+熟悉套接字编程接口,这还够吗?不够?
伟大的物理学家费曼提出了一种有效的费曼学习方法,该方法从问题开始并试图告诉问题来教导这一代。一旦你能清楚地解释问题,你就会学到它。所以我想尝试使TCP/IP清晰,以便我能够理解自己并顺便帮助读者。
虽然《TCP/IP详解卷1》是一本关于互联网协议系列的非常严谨和详细的书,但在我看来它有点令人尴尬,可能需要多次阅读以便能够理解。虽然我没有能力更好地说出这个问题,但是因为我经历过从无知到稍微理解的过程,这可能是主人无法比拟的,我会尝试用简单的语言来使用TCP/IP。知识很清楚。
网络协议
什么是TCP/IP?
TCP/IP协议套件是一组协议,也称为Internet协议套件,用于与Internet上的主机通信。 TCP和IP只是这些协议中的两个,它们也非常重要。因此,TCP/IP用于命名此Internet协议族。实际上,它还包括其他协议,如UDP,ICMP,IGMP,ARP/RARP等。网络分层
大学《计算机网络》教科书中有一个经典的网络ISO七层模型,但七层划分太薄,有点累赘,不易记忆。
Internet协议套件TCP/IP分为四层粗粒度,两个分区的对比图使得关系一目了然。
易于理解的网络协议(TCP/IP概述)
分层是计算机领域的常用技术。例如,Internet后端“访问逻辑存储”的三层体系结构是分层思维的典型应用。
分层用于隔离,通过分层功能,反汇编问题以及在层之间安排接口来掩盖实现细节。
TCP/IP从下到上分为链路层,网络层,传输层和应用层。下层提供上层,上层提供更高的抽象和下层的能力。
链路层,也称为网络接口层,包括操作系统的设备驱动程序和网卡,它们共同处理传输介质(光纤等)的物理接口细节。
网络层是IP层,负责处理网络中IP数据报的传输。 IP层传输IP数据报。使用路由表,IP数据报从网络的一端传输到另一端。简而言之:IP实现包路由被传输,IP协议和路由器在网络层工作。
传输层提供端到端通信,包括提供面向连接和高可靠性的TCP,以及无连接的不可靠UDP。似乎TCP更好,但事实并非如此。 UDP不需要构建开销,因此它更快且被广泛使用。例如,新一代互联网协议HTTP3从TCP切换到UDP,应根据适应场景选择传输层协议。
应用程序层与应用程序相关。不同的应用解决不同的问题,需要不同的应用层协议。
易于理解的网络协议(TCP/IP概述)
链路层处理介质上数据的传输,以及主机与网卡,光纤等交易的细节。因为它与硬件有关,所以需要使用系统的驱动程序。链路层协议定义了这些细节,例如如何从网卡向光纤发送数据,格式编码等,以及它所解决的数据在媒体上表示和流动。问题。
拥有链路层功能绝对不够。网络上有数千台机器。主机A与B通信。您无法向主机C发送数据。因此,实际上,您需要通过IP地址为主机分配网络地址。识别网络中的主机并发送需要正确路由到目标的数据包。这就像从家到公司的路径,要采取的路线,路由表类似于这个地图。 IP解决了网络中数据包传输路径的问题。
具有网络层的传输和路由能力是不够的,因为IP分组可能在传输过程中丢失。例如,如果中间经历的路由器缓冲区已满,则数据包将丢失。这是不可靠的。如果需要可靠的传输能力,则需要传输层基于IP层提供更多功能,并且TCP解决了可靠性问题。具体来说,如果发生丢包,TCP层将负责超时重传,通过接收确认和重传机制确保可靠的传输。另外,因为IP分组都是独立路由的,所以数据被分成从主机A到主机B的x和y IP分组。这两个分组可以选择不同的传输路径。 y数据包到达x数据包之前,但是我们想要在接收端(主机B)恢复数据,但是我们无法控制IP数据包的到达顺序,所以我们需要在接收时恢复数据结束,我只需要在x中,y数据包记录它所属的数据块的哪一部分,然后重新组织数据。这正是TCP所做的。它重新组合IP报告以确保订单并将其提交到应用层。有时,没有必要保证UDP可以提供的可靠性和顺序。它只是将数据封装到IP数据包中,然后通过IP层路由将其发送到目的地。
更进一步,它是应用层协议,如http,以及游戏服务器自定义协议,应用层协议通常基于TCP或UDP。
分层
协议是什么?我太懒了,无法通过协议的各种权威定义。我认为该协议是一项协议,类似于现实生活中协议的含义。网络协议是通信双方遵守的惯例。更具体地说,它定义了通过网络传输数据的格式,规则和过程。
由于网络是分层模型,并且不同的层具有不同的层,因此为每个层定义每个层的规则,并且每个层对应于每个层协议。
如前所述,TCP/IP协议族包含许多协议,这些协议属于不同的层并承担不同的角色。
易于理解的网络协议(TCP/IP概述)
TCP和UDP是两种主要的传输层协议。
IP是网络层的主要协议。 TCP和UDP都需要使用IP协议进行数据传输。
ICMP是一种Internet控制消息协议,是IP的附属协议。 IP层使用它与其他主机或路由器交换错误消息和其他重要信息。例如,当数据包通过某个路由器节点时,它超过了数据包的网络限制,并且没有分段,它会向发送方发送ICMP数据包报告错误消息,该消息属于ICMP以协助IP完成数据包传输。
IGMP是一种Internet组管理协议,用于将数据包组播到多个主机。
ARP(地址解析协议)和RARP(反向地址解析协议)用于转换IP和链路层地址,IP层使用IP地址,链路层使用Mac地址。
应用层和传输层使用端到端协议,网络层提供逐跳协议。
包
A通过网络向B发送一条数据。可以想象,传输原始数据是不够的。由于网络数据包被发送到路由器并需要转发,因此转发必须依赖于数据包的一些附加信息,例如目标机器。
当发送方发送数据时,原始数据根据协议格式添加一些控制信息,并且在网络上正确打包数据包的过程称为封装。
TCP/IP协议套件是逐层封装的。从应用层到链路层,为每个层添加附加信息(第一个和最后一个)。
易于理解的网络协议(TCP/IP概述)
用户数据通过应用程序传递到应用程序头,并传递给TCP层进行处理。
将TCP层添加到TCP标头后,将生成TCP段。TCP段是基于IP的,并且生成IP报头以生成IP数据报。
IP数据报由以太网驱动程序通过链路层处理,以太网报头+报尾用于生成以太网帧。以太网帧的长度介于46和1500之间。
更准确地说,在IP层和链路层发送的数据单元称为分组,该分组可以是IP数据报或IP数据报的片段。
UDP封装与TCP略有不同。它主要通过在传输层(UDP)之后添加一个8字节的UDP头来生成UDP数据报来实现。
在封装过程中,当TCP/UDP层通过时,端口号被添加到TCP/UDP头中;当IP层通过时,协议类型(TCP或UDP或ICMP或IGMP)被添加到IP头;在层的时候,帧类型(IP或ARP或RARP)被添加到以太网报头。该信息将用于接收端的处理。
接收端接收到数据后,应执行与发送端相对的解封装操作。我们可以将发送端的数据封装与沐浴后穿着一层衣服进行比较,接收端的操作类似于在洗澡前脱衣。剥去头部和尾部并获取原始数据。
由于网络上的主机具有不同的字节序,现在需要通过网络传输,它们需要在统一的网络端(大端)上达成一致,并且在网络上传输数据时,带有小端的主机应该变成大端。
地址
Internet上的每个接口都有一个唯一的网络地址,也称为IP地址。 IP地址有两个版本,IPv4和IPv6。 IPv4是32位4字节整数。每个字节(8位)的值范围是0~255,因此您可以使用四个以点分隔的字节值表示4个字节的IPv4,例如140.252.13.88。每个十进制值对应于32位整数的每个字节。这种表示法称为点分十进制。表示,很明显,点十进制方法和int32两个表示很容易在彼此之间进行转换。
IPv4地址分为五类ABCDE。 32位地址表示数值空间有限。难以为因特网上的所有联网设备分配独立的IP地址,因此存在动态分配,共享,公共网络+内联网地址转换(NAT)等。问题主要是解决IP地址不足的问题。
IPv6使用128位,2的128位功率非常大。它声称能够为地球上的每一粒沙子分配一个IP地址。IP数据报(网络层)使用IP地址,而以太网帧(链路层)使用硬件(48位Mac)地址。 ARP和RARP用于IP地址和硬件地址之间的映射(转换)。
港口
TCP/UDP使用16位端口号来标识(区分)应用程序。例如,主机A向主机B发送IP报告。主机B的内核收到IP报告后,应该处理哪个应用程序?端口号为此,内核维护端口号和应用程序之间的对应关系。
更常用的应用层协议具有合同端口号,这是一个众所周知的端口号,1024和5000之间的端口号被分配给TCP/IP以供临时使用,并且超过5000用于其他目的。也就是说,您使用TCP连接到网络服务器。本地为套接字分配的端口号将介于1024和5000之间,具体取决于操作系统的端口分配策略。
域名系统
域名系统(DNS)提供主机名和IP地址之间的转换。例如,www.baidu.com是域名。应用程序可以通过标准库函数(gethostbyname)获取给定名称主机的IP地址。标准库函数(gethostbyaddr)实现逆操作。
ip地址是一串数字,含义不清楚,不容易记住。主机名的含义更清楚。您可以在www.baidu.com上轻松记住它,这就是IP地址仍然需要主机名的原因。
划分
收到以太网数据帧(Frame)后,接收端需要从协议栈底部升级,即遵循链路层 - >
网络层 - >
传输层 - >
按照应用层的顺序,删除每个层协议添加的第一个和最后一个部分,并取出数据并提交给最上面的应用程序。这个过程称为解复用,本书的翻译称为解复用。
易于理解的网络协议(TCP/IP概述)
回顾前一个包的描述,在传输层,网络层和链路层,端口号存储在TCP/IP头中,协议类型存储在IP头中,帧类型存储在以太网帧头。因此,在接收端,从头部移除层,取出相应的信息,然后将其分派并丢弃到不同的模块进行处理。上图是整个处理过程。
摘要
本文讨论了地址,域名,端口,TCP/IP分层模型,封装和去除的概念。
你最好记住TCP/IP链路层 - >
网络层 - >
传输层 - >
应用层的四层。
在IP层和链路层之间传输的TCP段,UDP数据报,IP数据报,IP片段,以太网帧和数据单元包。这些概念是最好的定义,以便对话更专业而不是地球。数据封装,你读了几遍就能记住它。