概述
@Copyright 图片版权归笔者所有, 转载请告知.
目的
这篇文章能帮助大家快速回忆计算机网络体系, 当然短短的文章并不能深入表述, 文章并未涉及网络层和数据链路层, 重点叙述了传输层. 可能有所不足或错误, 也谢谢大家指出, 共同进步
结构体系简述
计算机网络协议体系结构目前有两种, 一种是 OSI/RM 七层协议, 另一种则是 TCP/IP 协议体系, 两种体系结构对计算机网络分别划分了 7 和 5 个层次,OSI/RM 是一种参考协议, 当前用的主要还是 TCP/IP 体系.
TCP/IP 概述
TCP/IP 协议族按照层次由上到下,层层包装。顶层是应用层,里面有 http,ftp, 等等我们熟悉的协议。第二层则是传输层,著名的 TCP 和 UDP 协议就在这个层次。第三层是网络层,IP 协议就在这里,它负责对数据加上 IP 地址和其他的数据以确定传输的目标。第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行 CRC 编码,为最后的数据传输做准备。再往下则是物理层了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等, 这不是我们关注的部分, 它几乎和 tcp/ip 协议的编写者没有任何的关系。发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以也把 tcp/ip 协议族称为 tcp/ip 协议栈。
详述
应用层
在应用层包含了不同类型的应用进程,如:telnet 远程登录、FTP 文件传输,qq 聊天等, 计算机应用直接接触的协议都放在应用层里, 需要通信时, 将应用层的信息按照应用层所对应的协议编写, 传向下一层.
例如 http 协议, 可以初略的理解成编写成文本后通过传输层发送. 如下测试图, 给大家参考下.
传输层
传输层主要为两台主机上的应用程序提供端到端的通信服务。在 TCP/IP 协议族中,有两个不同的传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。
TCP: 为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小数据块(数据段)交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时间等。由于传输层提供了高可靠性的端到端的通信服务,因此应用层可以忽略掉所有这些细节。
UDP: 为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。
这两种传输层协议分别在不同的网络环境与应用场合中有不同的用途。
功能
TCP 和 UDP 采用 16 bit 的端口号来识别不同的应用程序。
网络服务一般都是通过知名端口号来识别的。知名的 1~1023 之间的端口号由 Internet 号码分配机构(Internet Assigned Numbers Authority, IANA)来管理。现在 IANA 管理 1~1023 之间所有的端口号。大多数 TCP/IP 实现给临时端口分配 1024~5000 之间的端口号。大于 5000 的端口号是为其他服务(Internet 上并不常用的服务)预留的。
应用程序
FTP
TELNET
HTTP
HTTPS
熟知端口号
21
23
80
443
如果仔细检查这些标准的简单服务以及其他标准的 TCP/IP 服务(如 Telnet、FTP、SMTP 等)的端口号时,我们发现它们都是奇数。这是因为这些端口号都是从 NCP 端口号派生出来的(NCP,即网络控制协议,是 ARPANET 的传输层协议,是 TCP 的前身)。NCP 是单工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数端口号。当 TCP 和 UDP 成为标准的传输层协议时,每个应用程序只需要一个端口号,因此就使用了 NCP 中的奇数。
TCP 传输控制协议
先来一张亲手绘制的美图
如上, 便是一个 tcp 数据段的数据结构图
关键名词介绍
序号: 每个数据段中的数据部分中的每个字节都有一个序号, 而当前数据段的序号则为第一个字节的序号.
确认号: 希望对方传过来的下一数据段的序号.
窗口大小: 表示本端可以接收的数据量, 该量只针对数据部分的数据大小.
数据偏移: 因为数据段中存在可选项, 因此并不知道真正的数据是从哪儿开始的, 因此数据偏移记录了数据的其实位置.
URG: 紧急
ACK: 表示响应
RSH: 表示有数据传输
RST: 表示连接重置
SYN: 表示建立连接
FIN: 表示关闭连接
三次握手和四次挥手
先来一张三次握手图
1. 客户端说我要连接你, 于是把请求连接的 SYN 字段置为 1, 序列号为 n 的清量请求数据段发送给接收方.2. 接收方收到后, 发送了一个请求连接字段 SYN 和确认字段 ACK 置为 1, 序号为 m, 确认号为 n +1(表示我刚刚收到你的数据段序号为 n, 下面我希望收到 n + 1 的数据段) 的数据段给发送方.3, 发起连接的一方收到确认信息后, 对此确认信息进行确认, 于是发送了序号为 n +1, 确认号为 m + 1 的确认轻量级数据段进行确认.4. 接收方收到确认信息后, 此端到端的通信即创建成功.
注意在请求连接时, 可能会由于某种原因造成请求连接的数据中断. 此时接收方有超时机制, 避免长时间忙等. 超时重传机制将在另外一篇文章中完整展开.
若两方同时发起连接请求, 此时双方互为发送方和接收方, 通信依然能正常建立.
四次挥手图
1. 客户端发起关闭连接的请求, 于是发送 FIN 字段置为 1, 序号为 n 的数据段.2. 服务端收到请求后, 发送了 ACK 字段为 1, 序号为 m 的数据段, 因为关闭客户端发送数据的连接, 所以服务端不需要再收到确认了, 因此无需发送确认号.3. 当服务端认为自己数据传输完成了, 于是发起 FIN 字段为 1, 序号为 1, 确认号为 n + 1 的数据段, 因为上一次客户端发送的是序号 n, 所以此次请求希望收到 n + 1 的数据段. 客户端收到关闭请求后, 发送确认数据段.
注:
1. 以上 称服务端和客户端有些许绝对, 只是方便描述, 其实可以看做发送端和接收端, 即平级的.2. 关闭连接也可能发生数据段丢失, 因此也会引入超时重传机制.
附:
名词详解
SYN:TCP 连接的第一个包,非常小的一种数据包。TCP 首部的数据格式,如果不计任选字段,它通常是 20 个字节。每个 TCP 段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上 IP 首部中的源端 IP 地址和目的端 IP 地址唯一确定一个 TCP 连接。序号: 用来标识从 TCP 发端向 TCP 收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用序号对每个字节进行计数。序号是 32 bit 的无符号数。当建立一个新的连接时,SYN 标志变 1。序号字段包含由这个主机选择的该连接的初始序号 ISN(Initial Sequence Number)。因为 SYN 标志消耗了一个序号,该主机要发送数据的第一个字节序号为这个 ISN 加 1。确认序: 号包含发送确认的一端所期望收到的下一个序号。确认序号应当是上次已成功收到数据字节序号加 1。只有 ACK 标志为 1 时确认序号字段才有效。发送 ACK 无需任何额外代价,因为 32 bit 的确认序号字段和 ACK 标志一样,总是 TCP 首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK 标志也总是被设置为 1。TCP 为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。在 TCP 首部中有 6 个 code bits 中的多个可同时被设置为 1。含义如下:URG 紧急指针(urgent pointer)有效. ACK 确认序号有效。PSH 接收方应该尽快将这个报文段交给应用层。RST 重建连接。SYN 同步序号用来发起一个连接。FIN 发端完成发送任务。TCP 的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,窗口大小是一个 16 bit 字段,因而窗口大小最大为 65535bit 数据即 8KB。检验和覆盖了整个的 TCP 报文段:包括了 TCP 首部和 TCP 数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。最常见的可选字段是最长报文大小,又称为 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。