网络协议标准

协议标准官网组织

官网:https://www.rfc-editor.org/
目前主要的协议文档列表如下:

RFC编号描述
RFC 793TCP标准协议文档
RFC 792ICMP(因特网控制报文协议)文档
RFC 791IP标准协议文档
RFC 768UDP标准协议文档

进入RFC官网主页后,点击左侧Document Retrieval进入文档索引页,我可以根据需要下载对应的应用层协议文档。

tcp/ip 完整的数据包格式

IP标准协议

IP协议属于网络层。网络层负责在不同网络之间提供数据传输服务,实现主机之间的通信。主要工作

  • 路由选择:网络层负责确定数据包从源主机到目标主机的最佳路径。它使用路由选择算法来确定数据包应该经过哪些节点和链路才能到达目标主机。
  • 数据包转发:网络层根据路由选择的结果,将数据包从源主机发送到目标主机。这涉及到数据包的封装、分段、转发和解封装等过程。
  • IP地址分配:网络层使用IP地址来唯一标识主机和网络设备。网络层负责为主机分配IP地址,并确保数据包能够正确地传输到目标主机。
  • 数据包传输:网络层使用IP协议来处理数据包的传输。IP协议定义了数据包的格式、寻址方式以及路由选择算法等内容,确保数据包能够在网络中正确传输。

在 TCP/IP 协议中,使用 IP 协议传输数据的包被称为 IP 数据包,每个数据包都包含 IP 协议规定的内容。IP 协议规定的这些内容被称为 **IP 数据报文(IP Datagram)**或者 IP 数据报

IP 数据报文由首部(称为报头)和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

每个 IP 数据报都以一个 IP 报头开始。源计算机构造这个 IP 报头,而目的计算机利用 IP 报头中封装的信息处理数据。IP 报头中包含大量的信息,如源 IP 地址、目的 IP 地址、数据报长度、IP 版本号等。每个信息都被称为一个字段。

IP 数据报头字段如图所示。

IP 报头的最小长度为 20 字节,上图中每个字段的含义如下:

1) 版本(version)

占 4 位,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4,即 IPv4。

2) 首部长度(网际报头长度IHL)

占 4 位,可表示的最大十进制数值是 15。这个字段所表示数的单位是 32 位字长(1 个 32 位字长是 4 字节)。因此,当 IP 的首部长度为 1111 时(即十进制的 15),首部长度就达到 60 字节。当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。

数据部分永远在 4 字节的整数倍开始,这样在实现 IP 协议时较为方便。首部长度限制为 60 字节的缺点是,长度有时可能不够用,之所以限制长度为 60 字节,是希望用户尽量减少开销。最常用的首部长度就是 20 字节(即首部长度为 0101),这时不使用任何选项。

3) 区分服务(tos)

也被称为服务类型,占 8 位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998 年 IETF 把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。

4) 总长度(totlen)

首部和数据之和,单位为字节。总长度字段为 16 位,因此数据报的最大长度为 2^16-1=65535 字节。

5) 标识(identification)

用来标识数据报,占 16 位。IP 协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。

6) 标志(flag)

占 3 位。第一位未使用,其值为 0。第二位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。

7) 片偏移(offsetfrag)

占 13 位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 位)的整数倍。

8) 生存时间(TTL)

表示数据报在网络中的寿命,占 8 位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。

路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。

9) 协议

表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。

例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。

10) 首部检验和(checksum)

用于校验数据报的首部,占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。

11) 源地址

表示数据报的源 IP 地址,占 32 位。

12) 目的地址

表示数据报的目的 IP 地址,占 32 位。该字段用于校验发送是否正确。

13) 可选字段

该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。

14) 填充

由于可选字段中的长度不是固定的,使用若干个 0 填充该字段,可以保证整个报头的长度是 32 位的整数倍。

15) 数据部分

表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。

TCP标准协议

TCP协议属于传输层。传输层负责提供端到端的数据传输,并确保数据的可靠性和完整性。
因此在TCP链接中,传输层会将应用层的数据进行分片(Segmentation),并添加序号、校验等控制信息,封装到TCP数据包以便在网络中传输

TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。
因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。
注意
一个IP数据包理论上的最大数据量是65535字节,但实际传输中受到MTU的限制,且为了效率和兼容性,通常会使用远小于这个理论最大值的数据包大小
例如:以太网的标准MTU大小通常是1500字节
TCP报文中数据部分是可选的,即TCP报文可以不包含数据(同理IP包也可以不包含数据)。不含数据的TCP报文通常是一些确认和控制信息类的报文,如TCP建立连接时的三次握手和TCP终止时的四次挥手等。

1、源端口号(Source Port)

长度为16位,指明发送数据的进程。

2、目的端口号(Destination Port)

长度为16位,指明目的主机接收数据的进程。

3、序号(Sequence Number)

也称为序列号,长度为32位,序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,可以理解成对字节流的计数。

4、确认号(Acknowledgement Number)

长度为32位,确认号包含发送确认的一端所期望收到的下一个序号。确认号只有在ACK标志为1时才有效。

5、首部长度

长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5。

6、保留位(Reserved)

长度为6位,必须是0,它是为将来定义新用途保留的。

7、标志(Code Bits)

长度为6位,在TCP报文中不管是握手还是挥手还是传数据等,这6位标志都很重要。6位从左到右依次为:
URG:紧急标志位,说明紧急指针有效;
ACK:确认标志位,多数情况下空,说明确认序号有效;
PSH:推标志位,置位时表示接收方应立即请求将报文交给应用层;
RST:复位标志,用于重建一个已经混乱的连接;
SYN:同步标志,该标志仅在三次握手建立TCP连接时有效
FIN:结束标志,带该标志位的数据包用于结束一个TCP会话。

8、窗口大小(Window Size)

长度为16位,TCP流量控制由连接的每一端通过声明的窗口大小来提供。

9、检验和(Checksum)

长度为16位,该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。

10、紧急指针(Urgent Pointer)

长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。

11、选项(Options)

长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。通常包含:最长报文大小(MaximumSegment Size,MSS)、窗口扩大选项、时间戳选项、选择性确认(Selective ACKnowlegement,SACK)等。

12、数据

OSI 和 TCP/IP 网络分层模型详解(基础)

主流网络分层体系结构有两种:
◈OSI(Open Systems Interconnection Reference Model,开放系统互联基本参考模型),就是常说的七层网络模型。
◈TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/因特网协议)四层网络模型,也有人愿意归为 “五层网络模型”,以其中最重要的 TCP 协议和 IP 协议命名。

值得一提的是,由国际化标准组织制定的 OSI 模型,本来是最应该在全球范围内推广的网络模型,不过因为 OSI 的设计过于理想不合实际,再加上当时应用 TCP/IP 模型的因特网(Internet)已经覆盖了全球大部分地区。种种原因,导致 OSI 并没有取得市场化的成功,仅仅是获得了理论上的研究成果。而 TCP/IP 模型则被作为了事实上的国际标准。

TCP/IP 网络模型

请注意,计算机网络的分层体系结构虽然是抽象的,但实现则是具体的。

上图展示了 HTTP 应用数据在主机间传输的过程,首先自上而下、宏观的来看数据在分层网络模型里的流转。
应用层的 “HTTP 数据” 是实际需要被传输的数据
“HTTP 数据” 被下发到传输层,并添加上 TCP 首部成为传输层的 PDU(Protocol Data Unit,协议数据单元),称作数据段(Segment)。
数据段再被下发到网络层,添加了 IP 首部后成为网络层的 PDU,称作数据包(Packet)。
数据包再被下发到数据链路层添加了 Ethernet 首部后得到的 PDU 被称为数据帧(Frame)。
数据帧最后被下发到物理层,以 01 电信号(比特数据位)的形式在物理介质中传输。
TCP/IP 的每个层级都依赖于下层支撑,越往上就离用户越近,反正则离硬件越近。从上至下,不断为应用数据附加首部的过程称为封装,从下至上不断解析首部的过程则称为解封装

最终在物理层传输的数据帧如上图所示,含有多个首部(Head),它们具有不同的数据结构和功能,服务于数据传输的可行性。学习计算机网络,其实就是学习各式 Head 的功能,学习每一层的核心协议以及它所解决的问题。下面继续自下而上的对数据帧进行解析,深入各层级的实现细节。
物理介质层
物理介质是连接网络终端设备(计算机、交换机、路由器)的物理手段,最常见的有网线(双绞线),除此还有光纤、无线电波等。不同的物理介质决定了电信号传输的距离、带宽、速率、抗干扰能力等性能参数。

所以物理介质层主要解决的问题是:

规范了网络终端设备之间的电气、机械、流程和功能等方面的要求
规范了电频、速率、最大传输距离和物理接口等特征
物理层所带来的最直观的好处就是,我们可以使用同一根网线插进任何品牌的计算机上。

数据链路层

上文提到,数据实际会以电信号的形式在物理介质中传输,不过单纯的 01 数字显然是没有价值的,需要为电信号进行分组和排序,以特有的组织方式来赋予其特定的含义。数据链路层为了解决这个问题先后提出过包括有 Ethernet v.2、IEEE 802.2、Internetwork 在内的多种协议,其中又以 Ethernet 协议占据主导地位。
Ethernet 协议,即以太网协议,规定了电信号的分组方式。一组电信号称为一个数据帧,数据帧又由帧首、数据和帧尾三部分组成。发送方通过物理介质把数据帧发送给接收方,接收方接收到一组电信号,就会认为是接收到了一个数据帧。

◈数据帧首部:占 14 字节,包含有目标主机网卡 MAC 地址、源主机网卡 MAC 地址以及数据帧类型标识
◈数据:从上层(网络层)传递下来的数据包,范围在 [46, 1500] 个字节之间
◈数据帧尾部:占 4 个字节,是 CRC 校验序列,用来确定数据帧在传输过程中是否有损坏

MAC 地址

在规范了电信号解读方式后,数据链路层还要解决 “主机定位” 的问题:数据帧怎么知道自己应该被哪一台主机接收呢?
以太网协议规定了接入网络的终端设备都必须安装有网络设配器(即 NIC 网卡),数据帧必须由网卡发送,再由另一张网卡接收。每张网卡都被分配一个 MAC 地址,具有全球唯一性。而数据接收方的 MAC 地址就被记录在数据帧首部。

MAC 地址为 6 字节,使用 12 个十六进制数表示,e.g. 00:01:6C:06:A6:29
◈前 6 个十六进制数为厂商编号,由 IEEE(电气和电子工程师协会)分配给厂商
◈后 6 个则为该厂商的网卡流水号,由厂商自己分配
**以太网协议数据帧定位原理:**有了 MAC 地址以后,以太网协议采用广播形式,将数据帧发给本地网络内所有的主机,主机在接收数据帧后会解析数据帧首部的目标主机网卡 MAC 地址,再和自身的网卡 MAC 地址对比。若相同,就接收数据帧做下一步处理。若不同,则丢弃。

而且为了增幅广播的性能和组网的灵活性,一般会在本地网络中架设交换机来支持信号转发,交换机也是数据链路层的代表设备

数据链路层主要解决的问题是:对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

网络层

从理论来讲,使用 MAC 地址就可以实现定位到这里世界上任意一台计算机,前提是广播的作用域也是全球范围的,但这并不现实。MAC 地址的定位方式存在本地子网的局限性。所以除了以太网协议之外,还迫切的需要解决下列问题:
如何轻易的进行子网划分
如何隔离子网之间的广播信号
在隔离广播信号的前提下,如何保证子网之间的计算机依旧能够通信

IP 协议

IP(Internet Protocol,因特网协议)是网络层的核心协议,规定了网络层的封装规范,将上层(传输层)传递下来的数据段附加上 IP 首部封装成 IP 数据包,又称数据报文,IP 数据包同样由包首部和数据两部分组成,只是数据部分实际为传输层的数据段。

数据包首部长度为 20 字节,数据部分最大长度为 65515 字节,一个 IP 数据包总长达 65535 字节。而下层数据帧的数据部分最长为 1500 个字节,所以如果 IP 数据包的实际长度超过了 1500,就需要对 IP 数据包进行分片处理,由多个数据帧发送。
IP 数据包首部:

Version 版本号:标识 IP 地址的版本,目前有 IPv4 和 IPv6 两个版本
Header Length 首部长度:标识 IP 首部长度
Type of Service 服务类型:前 3 位标识优先级,4-7 位分别标识时延、吞吐量、可靠性、开销(一个数据包只能有一位生效)
Total Length 总长度:标识 IP 数据包总长
Identification 鉴定字段:IP 数据包的唯一标识,如果数据包被分片传输,接收方会根据分片中的该字段值来判断哪些分片属于同一个数据报,以此进行分片重组。通常的每发送一份数据包该值就会被加 1。
IP Flags 标志位:标识 IP 数据包是否被分片。
Fragment Offset 偏移量:在接收方进行分片重组时,标识分片的顺序,指明了分片起始点相对于数据包起始点的偏移量。因为 IP 协议是无连接的非可靠传输协议,所以需要该字段来应对分片传输错序的情况。
TTL 生存时间:标识生存时长,指明了数据报可以经过的路由器数量,防止丢失数据包的无休止传播。初始值由源主机设置(通常为32或64),每经过一个路由器,该字段值就会减 1。如果数据包的 TTL 减至 0,那么路由器会丢弃该数据包并发送一个 ICMP 超时消息给数据包的源主机 IP 地址。
Protocol 协议:标识数据包数据部分来自于哪个协议(ICMP/IGMP/TCP/UDP/GRE/ESP)。
Header Checksum 首部校验和:根据 IP 数据包首部计算出来的校验和
Option 选项:一个可变长的可选信息
Source Addres 源地址:IP 数据包源主机的 IP 地址
Destination Address 目标地址:IP 数据包的目标主机 IP 地址,是网关路由的关键依据。
**IP 地址:**因为 MAC 地址无法满足复杂的网络环境需求,所以 IP 协议制定了一套逻辑上的网络地址(IP/子网掩码)。IP 地址有 IPv4 和 IPv6 两个版本,通过子网掩码将 IP 地址分为网络号、主机号两个部分,前者标识了一个子网,后者标识了子网中的主机。如果两台主机处在同一子网,那么它们的网络号必须是相同的。IP 地址解决了 “如何轻易的进行子网划分” 的问题。

ARP 协议
引入 IP 地址后,接入网络的主机至少拥有一个 IP 地址和 MAC 地址。需要强调的是,IP 地址本质上是一个逻辑地址,为了解决上层复杂的子网架构问题而生,并不能作为最终定位主机的依据,这仍要依靠 MAC 地址来完成。因此,网络层还需要找到一种方法来完成 IP to MAC 的映射,ARP 协议应运而生。
ARP(Address Resolution Protocol,地址解析协议)提供了根据 IP 地址来获取 MAC 地址的能力,地址解析之名由此而来。
地址解析原理:主机间的通信时,ARP 协议首先会发起一个请求 IP 数据包,IP 数据包的首部包含有目标主机 IP 地址,这个数据包经由数据链路层、物理介质层,最终广播到子网内所有主机,主机接受到该 IP 数据包后解析出其首部所包含的目标主机 IP 地址,再和自身 IP 地址进行比对。若相同,则根据数据包首部包含的源主机 IP 地址将 MAC 地址返回;若不相同,则丢弃该数据包。同时 ARP 协议还会缓存一份地址映射表在本地,表记录为返回的 MAC 地址和目标主机 IP 地址。下次再需要通信时,ARP 会直接查询地址映射表以提高效率。

路由协议

通过 ARP 协议的地址解析原理不难发现,ARP 协议同样具有子网局限性。为了突破这一限制实现跨子网通信,网络层实现了路由协议。
路由协议提供了异构网(子网间)互联的能力,可以将一个子网的 IP 数据包发送到另一个子网。所谓 “路由” 即指导数据包转发的路径信息。路由协议是运行在路由器上的协议,在错综复杂的网络世界中,路由器充当了交通枢纽的角色,它会视实际的网络环境来选择最佳路径进行数据包转发,路由器是网络层的代表设备。
**IP 数据包路由原理:**主机间的通信时,首先会通过 IP 协议来判断两台主机是否处在同一子网。若是,直接交给 ARP 协议和以太网协议来完成子网广播。若不是,以太网协议则会将 IP 数据包发送到子网网关(一般为路由器)进行路由决策,在经过若干次网关路由转发之后,IP 数据包就进入到目标主机 IP 地址所处的子网中,最后还是通过子网广播完成主机定位。

可见,路由器和路由协议解决了 “如何隔离子网之间的广播信号” 和 “子网之间的计算机依旧能够通信” 的问题。
传输层
通过物理介质层、数据链路层和网络层的底层支撑,或者说通过 MAC 地址和 IP 地址的支撑,得以实现了主机间在全球互联网中的互联互通,所以三者也会被归纳为「基础传输层」。
不过仅仅支持 “主机定位” 依旧是不足以满足需求的,还需要完成主机上的 “应用程序定位” 才可以。因为互联网传输的数据往往是应用程序的数据,比如微信聊天,实际是两台设备上微信 APP 之间的数据传输。所以主机在接收到数据后,还需要解决:这个 IP 数据包应该交由谁来处理?就是所谓的 “应用程序定位” 问题。
对此,传输层规定为每个应用程序都指定一个特殊的 “地址” 来辅助定位,这个 “地址” 就是 —— 进程端口(Port)
传输层的主要作用就是建立进程与进程之间的通信,即 Port 到 Port 之间的数据传输,主要有 UDP 协议和 TCP 协议两种实现。如果你具有网络应用编程经验,那么你对 (IP, Port) 的组合应该不会感到陌生,这就是 Unix 系列操作系统定义的 Socket 套接字。

可用端口号在 [0, 65535] 之间,其中 [0, 1023] 属于系统端口,由操作系统原生服务进程使用,其余为用户端口,由用户自由分配。传输层的 PUD 为数据段(Segment),其首部也有 TCP 首部和 UDP 首部两种类型。

数据段首部为 8 字节,数据部分为上层应用数据占 65527 字节,总长不超过 65,535 字节,正好作为下层 IP 数据包的数据部分。

TCP 协议

TCP(Transmission Control Protocol,传输控制协议),是一种面向连接的可靠传输协议,提供可靠(无差错、不丢失、不重复、按顺序)的字节流数据传输服务。在传输效率和可靠性之间选择了后者,所以有开销大、传输速度慢的缺点。
面向连接:在使用 TCP 通信之前,需要进行 “三次握手” 建立发收双方连接,通信结束后还要进行 “四次挥手” 确保断开连接。
点对点:一条 TCP 连接只能连接两个端点。
全双工通信:允许通信双方任意时刻双向发送数据,发送方设有发送缓存,接收方设有接收缓存。
字节流传输:TCP 会将数据当作字节流进行处理,不尝试理解所传输的数据含义,仅把数据看作一连串的字节序列。
TCP 的可靠性传输具有非常复杂的实现细节,包括但不限于:
ACK 确定机制:当接收方接收到数据段后,会返回 ACK 确认
定时重发:发送方发送数据段后,会启动定时器,超时未接收到 ACK 确认,会重发该数据段
数据校验:接收方会对数据段进行数据校验,如果发现数据段有差错,会将该数据段丢弃,等待超时重传
顺序传输:TCP 字节流会为每个字节排序,确保数据传输顺序的正确性
滑动窗口:TCP 数据段长度可根据收发双方的缓存、网络等状态而调整。接收方只允许发送方发送接收缓冲区所能接纳的数据,防止缓冲区溢出
数据段首部:

Sequence Number 序列号:字节流中的每个字节都要按序编号,该字段值为本数据段数据部分的第一个字节的序号
Acknowledgment Number 确认号:确认序列号
Offset 偏移量:数据段首部的长度,字段值为首部长度除以 4
Reserved 预留:保留位,供今后使用
TCP flags 标签:标识数据段性质。
Window 窗口:标识发送者接收窗口的大小
CheckSum 校验值:用于检查数据段在传输过程中是否出现差错
Urgent Pointer 紧急指针:当字段值为 1 时生效,标识本数据段具有紧急数据
其中的 TCP Flags 字段,是非常重要的功能标识,占 8 位,分别为:
C(CWR)、E(ECE):用于支持 ECN(显示阻塞通告)
U(URGENT):当值为 1 时,标识此数据段有紧急数据(比如紧急关闭),应优先传送,要与紧急指针字段配合使用
A(ACK):仅当字段值为 1 时才有效,建立 TCP 连接后,所有数据段都必须把 ACK 字段值置为 1
P(PUSH):若 TCP 连接的一端希望另一端立即响应,PSH 字段便可以 “催促” 对方,不再等到缓存区填满才发送返回
R(RESET):若 TCP 连接出现严重差错,该字段的值置为 1,表示先断开 TCP 连接,再重连
S(SYN,Synchronize Sequence Numbers):用于建立和释放连接,当字段值为 1 时,表示建立连接。
F(FIN):用于释放连接,当字段值为 1 时,表明发送方已经发送完毕,要求释放 TCP 连接
下面以三次握手和四次挥手为例,看看数据段首部是怎么进行传输标识并以此来保存可靠性的。

三次握手:


建立连接时,客户端发送 (SYN=1,seq=x) 数据段到服务器,然后进入 SYN_SENT 状态并等待服务器确认;
服务器收到 (SYN=1,seq=x) 数据段后,返回 (ACK=1, ack=x+1, SYN=1, seq=y) 数据段,服务器进入 SYN_RECV 状态;
客户端收到服务器的 ACK 确认后,也会向服务器发送 ACK 确认 (ACK=1, ack=y+1),至此客户端和服务器都进入了 ESTABLISHED 状态。三次握手完成,TCP 连接建立成功。
为什么要使用三次握手来保证数据传输的可靠性?
“握手” 的行为实际上为了告知收发双方自己的 ISN(Initial Sequence Number,初始化序号),如上图的 seq=x 或 seq=y,这个数值会被作为建立连接之后进行顺序数据传输的依据。从数据段首部的 Sequence Number 和 Acknowledgment Number 都占 32 位可知,seq 和 ack 的取值范围均为 [0, 2^32-1],顺序循环使用。需要注意的是,seq 并非每次都是从 0 开始的,TCP 协议会以 4μs 一次的频率进行 ISN+=1 操作,以此来避免 TCP 重连时会出现同一条连接中存在两个及以上 seq 相同的包,最终导致顺序错乱。

四次挥手:


断开连接时,客户端发送 (FIN=1, seq=m) 数据段,其中 m 的数值为客户端最后一次向服务器发送的数据段的最后一个字节的序号再加上 1,客户端进入 FIN-WAIT-1 状态。
服务器接收到 (FIN=1, seq=m) 之后,返回 (ACK=1, ack=m+1, seq=n) 确认数据段,服务器进入 CLOSE-WAIT 状态。
服务器再向客户端发送 (FIN=1, seq=u, ACK=1, ack=m+1) 数据段,服务器进入 LAST-ACK 状态。
客户端接收到 (FIN=1, seq=u, ACK=1, ack=m+1) 数据段后,返回 (ACK=1, ack=u+1, seq=m+1) 确认数据段,服务器和客户端都进入 CLOSED 状态。四次挥手完成,TCP 连接就此断开。

UDP 协议

UDP(User Datagram Protocol,用户数据报协议),是一种无连接的非可靠传输层协议。UDP 不提供数据包分组、组装,不能对数据段进行排序,所以 UDP 数据段的首部非常简单。换句话说,当数据段发送出去之后,发送方是无法得知其是否完整且安全的到达了接收方的。这样的传输机制决定了它的最大优点就是快,同时也决定了它最大的缺点不可靠、不稳定。
UDP 数据段首部:

Source Port 源应用程序端口:发送方的应用程序端口
Destination Port 目的应用程序端口:接收方的应用程序端口
Length 长度:数据段的长度
Checksum 校验值:用于检查数据段在传输过程中是否出现差错
应用层
应用层是直接面向用户的,所以相对于数据传输的细节,应用层更加关注数据的表示形式,其主要工作是定义数据格式并按照相应的格式要求进行数据解读。因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP(万维网), FTP(文件传输), SMTP(邮件) 等等。
以互联网上应用最广泛的 HTTP(HyperText Transfer Protocol,超文本传输协议)为例,其数据首部格式如下:

如上图标记内容,HTTP 规范了定义和解读数据格式的方式:
在 Request Headers 中使用 Content-Type 表示客户端发送的数据格式类型,Accept 表示客户端期望接受的数据格式类型
在 Response Headers 中使用 Content-Type 表示服务器端响应的数据格式类型
通常 Request Accept 需要与 Response Content-Type 保持一致
总结一下,应用层的作用主要是为计算机上的应用程序提供服务,包括提供数据格式表现、数据加密、远程终端会话等应用功能。应用层无需关心数据的传输细节,这是分层设计带来的好处,程序员完全可以在不了解底层协议的前提下使用应用层的众多协议来进行工作。
**
最后
回顾总结一下:**
物理介质层:是最底层的数据传输物理媒介
数据链路层:通过 MAC 地址来定位本地子网中的主机
网络层:通过 IP 地址来定位不同子网间的主机
传输层:通过 Port 来定位到主机上的应用程序
应用层:为主机上不同的应用程序提供服务
核心协议全家福:

UDP标准协议

UDP数据段格式比较简单,如下:

UDP格式详解

UDP数据报由首部和数据两部分组成,其中首部只有8B(字节)。

1、源端口号(Source Port)

长度为16位,指明发送数据的进程。

2、目的端口号(Destination Port)

长度为16位,指明目的主机接收数据的进程。

3、长度

长度为16位,该字段值为报头和数据两部分的总字节数。

4、检验和(Checksum)

长度为16位,UDP检验和作用于UDP报头和UDP数据的所有位。由发送端计算和存储,由接收端校验。

5、数据

ICMP(因特网控制报文协议)

ICMP协议格式

ICMP报文是在IP数据报内部传输的:| IP头部 | ICMP报文 |

ICMP报文格式

Bits    0–7     8–15    16–23   24–31
  0       Type     Code        Checksum
  32      Rest of Header
  • Type – ICMP type as specified below.
  • Code – Subtype to the given type.
  • Checksum – Error checking data. Calculated from the ICMP header+data, with value 0 for this field. The checksum algorithm is specified in RFC 1071.
  • Rest of Header – Four byte field. Will vary based on the ICMP type and code.

ICMP报文可以分为两类:查询报文和差错报文,具体报文类型如下图所示:
image.png
下面各种情况都不会导致产生ICMP差错报文:

  1. ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。 2) 目的地址是广播地址或多播地址的IP数据报。 3) 作为链路层广播的数据报。 4) 不是IP分片的第一片。 5) 源地址为零地址、环回地址、广播地址或多播地址。
    这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。

ICMP地址掩码请求

ICMP地址掩码请求用于无盘系统启动时获取自己的子网掩码。
构造一个ICMP Address Mask Request:

#We want to send an ICMP packet Address Mask Request and wait 10 seconds to see the replies. We mask the packet with source address of 10.2.3.4 and we send it to the address 10.0.1.255:
icmpush -mask -sp 10.2.3.4 -to 10 10.0.1.255

注意:ICMP地址掩码应答必须是收到请求接口的子网掩码

ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间,返回的建议值是自午夜开始计算的毫秒数,协调的统一时间,可以达到毫秒的分辨率。
image.png
构造一个ICMP时间戳请求: icmpush -tstamp 192.168.3.255

ICMP端口不可达差错

根据code的不同,共有15种类型的ICMP差错报文。
image.png
注意,ICMP报文是在主机之间交换的,而不用目的端口号,而UDP数据报则是从一个特定端口发送到另一个特定端口。
ICMP的一个规则是, ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。导致差错的数据报中的IP首部要被送回的原因是因为IP首部中包含了协议字段,使得ICMP可以知道如何解释后面的8个字节。对于TCP和UDP协议来说,这8个字节正好是源端口号和目的端口号。

ping

ping通过ICMP回显请求和应答实现。

# setup ping interval in seconds
ping -i 5 IP

# Check whether the local network interface is up and running
ping 0

# Set packet num
ping -c 5 google.com

# Set packet size
ping -s 100 localhost

traceroute

ping程序提供一个记录路由选项,但并不是所有的路由机都支持这个选项,而且IP首部选项字段最多也只能存储9个IP地址,因此开发traceroute是必要的。 traceroute利用了ICMP报文和IP首部的TTL字段。TTL是一个8bit的字段,为路由器的跳站计数器,也表示数据报的生存周期。每个处理数据报的路由器都需要将TTL减一。如果TTL为0或者1,则路由器不转发该数据报,如果TTL为1,路由器丢弃该包并给源地址发送一个ICMP超时报文(如果是主机接收到TTL为1的数据报可以交给上层应用程序)。
traceroute程序开始时发送一个TTL字段为1的UDP数据报(选择一个不可能的值作为UDP端口号),然后将TTL每次加1,以确定路径中每个路由器。每个路由器在丢弃UDP数据报的时候都返回一个ICMP超时报文(如:ICMP time exceeded in-transit, length 36),而最终主机则产生一个ICMP端口不可达报文(如: ICMP 74.125.128.103 udp port 33492 unreachable, length )。
对每个TTL,发送3份数据报,并且计算打印出往返时间。如果5秒内未收到任意一份回应,则打印一个星号。
需要注意的是:

  1. 并不能保证现在的路由就是将来所采用的路由;
  2. 不能保证ICMP报文的路由与traceroute程序发出的UDP数据报采用同一路由;
  3. 返回的ICMP报文中信源的IP地址是UDP数据报到达的路由器接口的IP地址。

ARP(硬件 地址解析协议)

链路层通信根据48bit以太网地址(硬件地址)来确定目的接口,而地址解析协议负责32bit IP地址与48bit以太网地址之间的映射:

  • (1)ARP负责将IP地址映射到对应的硬件地址
  • (2)RARP负责相反的过程,通常用于无盘系统。

ARP高速缓存

ARP高效运行的关键是每台主机上都有一个ARP高速缓存,缓存中每一项的生存时间一般为20分钟,但不完整表项超时时间一般为3分钟(如192.168.13.254)。

# arp -a

? (192.168.0.16) at 00:1b:21:b9:9f:d4 [ether] on eth0
? (192.168.0.6) at 00:1b:21:b9:9f:d4 [ether] on eth0
? (192.168.13.233) at 00:16:3e:01:7a:b2 [ether] on eth0
? (192.168.13.254) at <incomplete> on eth0

可以通过arp命令来操作ARP高速缓存:

  • arp 显示当前的ARP缓存列表。
  • arp -s ip mac 添加静态ARP记录,如果需要永久保存,应该编辑/etc/ethers文件。
  • arp -f 使/etc/ethers中的静态ARP记录生效。

ARP分组格式

image.png
其中:

  • ARP协议的帧类型为0x0806
  • 硬件类型:1表示以太网地址
  • 协议类型:0x800表示IP协议
  • 硬件地址长度:值为6
  • 协议地址长度:值为4
  • op:1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答
  • 对于ARP请求来说,目的端硬件地址为广播地址FF:FF:FF:FF:FF:FF),由ARP相应的主机填入。

一个完整ARP请求应答的抓包:

# tcpdump -e -p arp -n -vv
21:08:10.329163 00:16:3e:01:79:43 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.14.23 tell 192.168.13.43, length 28
21:08:10.329626 00:16:3e:01:7b:17 > 00:16:3e:01:79:43, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Reply 192.168.14.23 is-at 00:16:3e:01:7b:17, length 46

ARP代理

当向位于不同网络的主机发送ARP请求时,由两个网络之间的路由器响应该ARP请求,这个过程称为ARP代理。
ARP代理也称为混合ARP:通过两个网络之间的路由器可以互相隐藏物理网络。

免费ARP

主机发送ARP请求查找自己的IP地址。通常有两个用途:

  • (1)确认网络中是否有其他主机设置了相同的IP地址;
  • (2)当主机的物理地址改变了,可以通过免费ARP更新更新路由器和其他主机中的高速缓存。

RARP

  1. RARP通常用于无盘系统,无盘系统从物理网卡上读到硬件地址后,发送一个RARP请求查询自己的IP地址。
  2. RARP的协议格式:与ARP协议一致,只不过帧类型代码为0x8035
  3. RARP使用链路层广播,这样阻止了大多数路由器转发ARAP请求,只返回很小的信息,即IP地址。

    DHCP和DNS(地址解析协议)

DHCP(主机动态获取IP地址的配置解析)

DHCP(Dynamic Host Configuration Protocol)是一个用于主机动态获取IP地址的配置解析,使用UDP报文传送,端口号为67(server)和68(client)。
DHCP使用了租约的概念,或称为计算机IP地址的有效期。租用时间是不定的,主要取决于用户在某地连接Internet需要多久,这对于教育行业和其它用户频繁改变的环境是很实用的。通过较短的租期,DHCP能够在一个计算机比可用IP地址多的环境中动态地重新配置网络。DHCP支持为计算机分配静态地址,如需要永久性IP地址的Web服务器。

DNS(解析域名和IP地址对应关系以及电子邮件选路信息的服务)

DNS(Domain Name System)是一个解析域名和IP地址对应关系以及电子邮件选路信息的服务。它以递归的方式运行:首先访问最近的DNS服务器,如果查询到域名对应的IP地址则直接返回,否则的话再向上一级查询。DNS通常以UDP报文来传送,并使用端口号53。
从应用的角度来看,其实就是两个库函数gethostbyname()和gethostbyaddr()。
FQDN:全域名(FQDN,Fully Qualified Domain Name)是指主机名加上全路径,全路径中列出了序列中所有域成员(包括root)。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。
资源记录(RR)

  • A记录: 用于查询IP地址
  • PTR记录: 逆向查询记录,用于从IP地址查询域名
  • CNAME: 表示“规范名字”,用来表示一个域名,也通常称为别名
  • HINFO: 表示主机信息,包括主机CPU和操作系统的两个字符串
  • MX: 邮件交换记录
  • NS: 名字服务器记录,即下一级域名信息的服务器地址,只能设置为域名,不能是IP

高速缓存
为了减少DNS的通信量,所有的名字服务器均使用高速缓存。在标准Unix是实现中,高速缓存是由名字服务器而不是名字解释器来维护的。
用UDP还是TCP
DNS服务器支持TCP和UDP两种协议的查询方式,而且端口都是53。而大多数的查询都是UDP查询的,一般需要TCP查询的有两种情况:

  1. 当查询数据多大以至于产生了数据截断(TC标志为1),这时,需要利用TCP的分片能力来进行数据传输(看TCP的相关章节)。
  2. 当主(master)服务器和辅(slave)服务器之间通信,辅服务器要拿到主服务器的zone信息的时候。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值