1. 一些概念
- 传输层充当了网络应用程序与网络之间的接口,能够把网络数据传递给特定的应用程序, 并且能够对网络传输提供了可选的错误检测、流量控制和验证功能。
- 在TCP/IP 系统中,应用程序可以使用端口号通过 TCP 或 UDP 指定数据目的地。
- 端口是一个预定义的内部地址,充当从应用程序到传输层或是从传输层到应用程序之间的通路。
- 进一步观察传输层这种与应用程序相关的寻址体制,就会发现 TCP 和 UDP 数据实际是被发送到一个套接字上的。套接字是一个由 IP 地址和端口号组成的地址。 例如,套接字地址 111.121.131.141.21 指向 IP 地址为 111.121.131.141 的计算机的端口 21。
2. 传输层协议需要提供以下功能:
- 为网络应用程序提供接口, 即为应用程序提供访问网络的途径, 设计者希望不仅能够向目的计算机传递数据,还能够向目的计算机上的特定程序传递数据。
- 多路复用/多路分解机制:这里的多路复用表示从不同的应用程序和计算机接收数据,再把数据传递到目的计算机上的接收程序。换句话说,传输层必须能够同时支持多个网络程序和管理传递给网际层的数据流。在接收端,传输层必须能够从网际层接收数据,把它转发到多个程序,这种功能被称为多路分解,它可以让一台计算机同时支持多个网络程序,比如一个 Web 浏览器、一个 E-mail 客户端和一个文件共享应用程序。多路复用/多路分解的另一个作用是可以让一个应用程序同时保持与多台计算机的连接。
- 错误检测、流量控制和验证
- 传输控制协议(TCP):TCP 提供了完善的错误控制和流量控制,能够确保数据正确传输,它是一个面向连接的协议。
- 用户数据报协议(UDP):UDP 只提供了非常基本的错误检测,用于不需要 TCP 精细控制功能的场合,它是一个无连接的协议。
3. 一些概念:
- 面向连接的协议:会在通信计算机之间建立并维护一个 连接, 并在传输的过程中监视连接的状态。即通过网络传输的每个数据包都有一个确认, 发送端计算机会记录状态信息来确保每个数据包都被准确无误地接收了, 并且在需要时会重发数据。当数据传输结束之后, 双方会以适当方式关闭连接。
- 无连接的协议:以当向方式向目的发送数据报, 不承担通知目的关于数据发送的职责, 目的计算机接收到数据之后也不需要向源计算机返回状态信息。
- 可以这样说,TCP 是为了可靠性,而 UDP 是为了速度。 必须要支持交互会话的应用程序,比如 Telnet 和 FTP,就会使用 TCP。而自己实现错误检测或不需要过多错误控制的应用程序会倾向于使用 UDP。
- 套接字寻址系统使得 TCP 和 UDP 能够执行传输层另一个重要任务:多路复用和多路分解。
- 多路复用是指把多个来源的数据导向一个输出
- 多路分解是把从一个来源接收的数据发送到多个输出
- 多路复用和多路分解的关键就在于套接字地址。套接字为特定计算机上的特定应用程序提供了一个 唯一的标识。
4. 一台计算机如何通过套接字访问目的计算机上的一个应用程序:
- 计算机 A 通过一个熟知的端口向计算机 B 上的一个应用程序发起一个连接。端口与 IP 地址组合之后就构成了计算机 A 的目的套接字。连接请求包含着一个数据字段,告诉计算机 B 使用什么套接字向计算机 A 返回信息,这也就是计算机 A 的源套接字地址。
- 计算机 B 通过熟知端口接收到来自计算机 A 的请求,向作为计算机 A 源地址的套接字发送一个响应。这个套接字就成为计算机 B 上的应用程序向计算机 A 上的应用程序发送消息的目的地址。
5. TCP的一些特性:
- TCP 是一个由 通告和确认 组成的复杂系统,
- 面向流的处理:TCP 以流的方式处理数据。 换句话说,TCP可以 一个字节一个字节地接收数据,而不是一次接收一个预定义格式的数据块。TCP 把接收到的数据 组成长度不定的段,再传递到网际层。
- 重新排序:如果数据以错误的顺序到达目的,TCP 模块能够对数据 重新排序来恢复原始顺序。
- 流量控制:TCP 的流量控制特性能够确保数据传输 不会超过 目的计算机 接收数据的能力。
- 优先级与安全:国防部对 TCP 的规范要求可以为 TCP 连接设置 可选的安全级别和优先级
- 适当的关闭:TCP 像重视建立连接一样 重视关闭连接 的工作,以确保在连接被关闭之前,所有的数据段 都被发送和接收了。
6. TCP 数据格式:
- 源端口:16位
- 目的端口:16位
- 序列号:32位 ??????????
- 确认号:32位, 用于确认已经收到的数据分段, 其值是计算机即将接受的下一个序列号, 也就是下一个接收的字节的序列号加1
- 数据偏移:4位 ???
- 保留:6位,保留字段,为TCP将来的发展预留空间,目前必须全部是0。
- 控制标记:分别占用1位 ???
- URG:为 1 时表示当前数据分段是紧急的,也会让“紧急指针”字段的值有意义。
- ACK:为 1 时表示“确认号”字段是有意义的。
- PSH:为 1 时让 TCP 软件把目前收到的全部数据都通过管道传递给接收应用程序。
- RST:为 1 时会重置连接。
- SYN:为 1 时表示序列号将被同步,这是说明这是一个连接的开始。
- FIN:为 1 时表示发送端计算机已经没有数据需要发送了。这个标记用于关闭一个连接。
- 窗口:16 位, 用于流量控制的参数。它定义了发送端计算机的发送序列号可以超过最后一个已确认序列号的数量。也就是说,发送方不必等待每个数据段被确认接收之后才发送下一个数据分段,允许已经确认接收的序列号与正在发送的序列号有一定差别,但必须在适当范围之内。
- 校验和:16 位,用于检验数据分段的完整性。接收端计算机会根据接收到的数据分段计算校验和,并且把结构与这个字段的值进行比较。TCP 和 UDP 在计算校验和时包含一个具有 IP 地址的伪报头。
- 紧急指针:16位,这是一个偏移量指针,指向标记紧急信息开始的序列号。
- 选项:指定一些可选设置中的某一项。
- 填充:额外填充的 0(根据需要),以确保数据从 32 位字的边界开始。
- 数据:数据分段中的数据。
6. TCP 连接:
- TCP 的功能之一是为应用程序提供访问网络的接口。这个接口是通过 TCP 端口提供的,而 为了通过端口提供连接,必须打开 TCP 与应用程序的接口。 TCP支持以下两种打开状态。
- (1)被动打开:某个应用程序进程通知 TCP 准备通过 TCP 端口接收连接,这样就会打开 TCP 到应用程序的连接,从而为参与连接请求做准备。
- (2)主动打开:程序要求 TCP 发起与另一台计算机(处于被动打开状态)的连接,这就是主动打开状态(实际上,TCP 可以对一个处于主动打开状态的计算机初发起连接,以解决两台计算机可能同时尝试建立连接的问题)。
- 如果发送端计算机没有在 指定时间内收到确认 消息,它会从已经得到确认的下一字节重新发送数据。
7. 三次握手:
- 序列号同步的过程被称为三次握手。 三次握手总是发生在 TCP 连接建立的初期。
- (1)计算机 A 发送一个数据分段, 其中的参数是:
- SYN=1
- ACK=0
- 序列号=X(X 是计算机 A 的 ISN, 即初始序列号)
- 第一个数据分段的报头中还包含初始序列号(ISN),标记了计算机将传输的第一个字节的序列号。也就是说,要发送给计算机 B 的第 1 个字节的序列号是 ISN 加1。
- (2)计算机 B 接收到计算机 A 的数据分段,返回一个数据分段,其中的参数是:
- SYN=1(仍然在同步阶段)
- ACK=1(“确认号”字段将包含一个值)
- 序列号=Y(Y是计算机 B 的 ISN)
- 确认号=M+1 (其中的 M 是从计算机 A 接收到的最后一个序列号)
- (3)计算机 A 向计算机 B 发送一个数据分段,确认收到计算机 B 的 ISN:
- SYN=0
- ACK=1
- 序列号=序列中下一个号码(M+1)
- 确认号=N+1(其中N是从计算机B接收到的最后一个序列号)
- 在这三次握手完成之后,连接就被打开了,TCP 模块就利用序列和确信机制发送和接收数据。
8. TCP 流量控制
- TCP 报头中的 “窗口”字段 为连接提供了一种流量控制机制,其目的是防止发送端计算机发送得太快,以 避免 接收端计算机 来不及处理 接收到的数据而导致数据丢失。TCP 使用的流量控制方法被称为 “滑动窗口” 方法。接收端计算机利用“窗口”字段 (也被称为“缓存大小”字段) 来定义一个超过最后一个已确认序列号的序列号“窗口”,在这个范围内的序列号才允许发送端计算机进行发送。 发送端计算机在没有接收到下一个确认消息之前不能发送超过这个窗口的序列号。
9. 关闭连接
- 当需要关闭连接时,计算机开始关闭过程。计算机 A 发送一个数据分段,其中的 FIN 标记设置为 1。之后应用程序进入“结束——等待(fin-wait)”状态。
- 在这个状态下,计算机 A 的 TCP 软件继续接收数据分段,并处理已经在序列中的数据分段,但不再从应用程序接收数据了。
- 当计算机 B 接收到 FIN 数据分段时,它返回对 FIN 的确认信息,然后发送剩余的数据分段,通知本地应用程序接收到了FIN消息。
- 计算机 B 向计算机A发送一个 FIN 数据分段
- 计算机 A 会返回确认消息,连接就被关闭了。
10. 无连接传输协议
- UDP 实际上它能够执行基本的错误检验,即它具有有限的错误检验功能。
- UDP 数据报中包含一个校验和,接收端计算机可以利用它来检验数据的完整性。
- UDP 没有像 TCP 那样提供数据的重新排序功能。
- UDP 的简单、无连接设计让它 成为网络广播所使用的协议
- UDP 协议的主要用途是把数据报传递给应用层。
- UDP 不会重新传输丢失或损坏的数据报、重新排列混乱的接收数据、消除重复的数据报、确认数据报的接收、建立或是终止连接。它主要是在程序不必使用 TCP 连接开销的情况下发送和接收数据报的一种方式。如果上述功能对于应用程序来说是必需的,它可以自己提供这些功能。
11. UDP 包含 4 个 16 位字段:
- 源端口:16 位,占据UDP报头的前 16 位, 通常包含发送数据报的应用程序所使用的 UDP 端口, 是可选的, 如果发送端的应用程序不写入其端口号,就应该把这个字段全置为 0。, 如果为 0 , 比如单向消息就不需要响应。
- 目的端口:16 位
- 长度, 这 16 位字段以字节为单位表示 UDP 数据报的长度。这个长度包括了 UDP 报头和 UDP 数据载荷。因为 UDP 报头的长度是 8 字节,所以 这个值最小是 8。
- 校验和:这 16 位字段可以检验数据在传输过程中是否损坏。目的计算机对它进行检验,让客户端用用程序能够判断数据报是否完整。
- 由于实际的 UDP 报头并不包含源 IP 地址或目标 IP 地址,数据报可能会被传输到错误的计算机或服务。校验和使用的部分数据来自于从 IP 报头(被称为伪报头)提取的值,这个伪报头包含了目的 IP 地址信息,让接收段计算机能够判断 UDP 数据报是否被错误交付。
12. 防火墙和端口
- 防火墙是一个系统,保护局域网不被来自 Internet 的 未授权用户攻击。
- 防火墙最基本特性就是 阻断对特定TCP和UDP端口的访问。
- 服务器安装防火墙之后,局域网中的用户能够在防火墙之内自由地访问服务器上的 TCP 端口 22,而局域网之外的网络用户就不能访问服务器的 TCP 端口 22,也就不能通过 SSH 访问服务器了。
- 网络管理员一般会阻断对全部端口的访问,除了必需的端口,比如处理 E-mail 的端口。
- 在连接 Internet 的计算机上,比如 Web 服务器,通常会在外部放置一个防火墙,从而避免对这台计算机的访问导致对局域网的非法访问。
13. 总结
- TCP 的质量保证是以性能为代价的。如果 TCP 提供的错误控制与流量控制是不必要的,则 UDP 会是一种更好的选择,因为它的速度更快。
- TCP 的控制和恢复特性 提供了交互会话所需的可靠连接。 所以像 Telnet 和 FTP 这种支持交互会话的应用程序使用 TCP 而不是UDP。
- Internet 防火墙 关闭对特定端口的访问 以阻止 Internet 用户访问使用该端口的应用程序。防火墙还能阻止对 Internet 的访问,从而防止局域网内部的用户使用 Internet 上的特定服务。
- 三次握手的第3步为什么是必需的? 在前两步之后,两台计算机已经交换了 ISN 号,所以从理论上来说它们已经具有了足够的信息来同步连接。但是,在第 2 步中发送 ISN 的计算机还没有收到确认,因此第 3 步正是确认第 2 步中收到的 ISN。
- UDP 报头中源端口字段是可选的。 UDP 是一个无连接协议,接收端计算机上的 UDP 软件不需要知道源端口。只有在接收软件需要源端口信息进行错误检验时,这个字段才是必要的。
14. 延申
- 假设你创建了自己的网络服务:需要考虑是使用 TCP 还是 UDP 传输协议来设计服务。在分析时,需要考虑如下因素:
- (1)性能;
- (2)可靠性;
- (3)编程时间。