欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

chapter02_传输层_TCP_UDP_SCTP

程序员文章站 2022-07-14 20:34:03
...

chapter_02 传输层:TCP、UDP和SCTP

这篇文章是我自己看的,整理自己的思路,仅放在网上便于保存&&分享。

相对于书而言,内容没有什么价值。书上的内容全面可靠。

PS:文章是建立在我的知识体系之上。因而,文中也不会有多余解释。


一、内容

1、概述

UDP是一个简单的、 不可靠的数据报协议, 而TCP是一个复杂、 可靠的字节流协议。 SCTP与TCP类似之处在于它也是一个可靠的传输协议, 但它还提供消息边界、 传输级别多宿(multihoming) 支持以及将头端阻塞(head-of-line blocking) 减少到最小的一种方法。我们必须了解由这些传输层协议提供给应用进程的服务, 这样才能弄清这些协议处理什么, 应用进程中又需要处理什么。

本章将阐述以下相关主题: TCP的三路握手、 TCP的连接终止序列和TCP的TIME_WAIT状态, SCTP的四路握手和SCTP的连接终止, 加上由套接字层提供的TCP、 UDP和SCTP缓冲机制, 等等。

2、总图

chapter02_传输层_TCP_UDP_SCTP

2.1 总图解释 ⭐️

TCP 传输控制协议(Transmission Control Protocol) 。 TCP是一个面向连接的协议, 为用户进程提供可靠的全双工字节流。 TCP套接字是一种流套接字(stream socket) 。 TCP关心确认、 超时和重传之类的细节。 大多数
因特网应用程序使用TCP。 注意, TCP既可以使用IPv4, 也可以使用IPv6。UDP 用户数据报协议(User Datagram Protocol) 。

UDP是一个无连接协议。 UDP套接字是一种数据报套接字(datagram socket) 。 UDP数据报不能保证最终到达它们的目的地。 与TCP一样, UDP既可以使用IPv4, 也可以使用IPv6。

SCTP 流控制传输协议(Stream Control Transmission Protocol) 。 SCTP是一个提供可靠全双工关联的面向连接的协议, 我们使用“关联”一词来指称SCTP中的连接, 因为SCTP是多宿的, 从而每个关联的两端均涉及一组IP地址和一个端口号。 SCTP提供消息服务, 也就是维护来自应用层的记录边界。 与TCP和UDP一样, SCTP既可以使用IPv4, 也可以使用IPv6, 而且能够在同一个关联中同时使用它们。

ICMP 网际控制消息协议(Internet Control Message Protocol) 。 ICMP处理在路由器和主机之间流通的错误和控制消息。 这些消息通常由TCP/IP网络支持软件本身(而不是用户进程) 产生和处理。不过图中展示的ping和traceroute程序同样使用ICMP。 有时我们称这个协议为ICMPv4, 以便与ICMPv6相区别

IGMP 网际组管理协议(Internet Group Management Protocol) 。 IGMP用于多播。

ARP 地址解析协议(Address Resolution Protocol) 。 ARP把一个IPv4地址映射成一个硬件地址(如以太网地址) 。 ARP通常用于诸如以太网、令牌环网和FDDI等广播网络, 在点到点网络上并不需要。

RARP 反向地址解析协议(Reverse Address Resolution Protocol) 。RARP把一个硬件地址映射成一个IPv4地址。 它有时用于无盘节点的引导。

ICMPv6 网际控制消息协议版本6(Internet Control Message Protocol version 6) 。 ICMPv6综合了ICMPv4、 IGMP和ARP的功能。

BPF BSD分组过滤器(BSD packet filter) 。 该接口提供对于数据链路层的访问能力, 通常可以在源自Berkeley的内核中找到。

DLPI 数据链路提供者接口(datalink provider interface) 。 该接口也提供对于数据链路层的访问能力, 通常随SVR4内核提供。

我们使用术语“IPv4/IPv6主机”或“双栈主机”表示同时支持IPv4和IPv6的主机。(至于主机如何支持两种协议的。《计算机网络》谢希仁 书中有挺详细的介绍。)

2.2 一件“往事”

从书上复制的似乎有点多。因为这些概念还是挺重要的。

我这里补充下,我以前因为概念不清楚干过的事。

使用proxychains,在终端进行代理。操作可以参考:利用proxychains在终端使用socks5代理

配置完之后,我检测下是否成功。

#正确操作
proxychains wget www.google.com
#错误操作
proxychains ping www.google.com

原因解释:

  • GNU Wget(常简称为Wget)是一个在网络上进行下载的简单而强大的*软件,其本身也是GNU计划的一部分。它的名字是“World Wide Web”和“Get”的结合,同时也隐含了软件的主要功能。当前它支持通过HTTPHTTPS,以及FTP这三个最常见的TCP/IP协议协议下载。(来自wiki–Wget)

  • 上面所示:ping 使用的是ICMP协议

  • This program forces any tcp connection made by any given tcp client to follow through proxy (or proxy chain). It is a kind of proxifier. (来自man proxychains)。This version (v4) supports SOCKS4, SOCKS5 and HTTP CONNECT proxy servers.

  • SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是"SOCKetS"的缩写[1]

    防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。

    这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。 (来自 wiki —SOCKS

  • 所以上面错误操作的原因是proxychains不支持ICMP协议。而关于proxychians的细节/原理,我不清楚。

3、UDP

应用进程往一个UDP套接字写入一个消息, 该消息随后被封装(encapsulating) 到一个UDP数据报, 该UDP数据报进而又被封装到一个IP数据报, 然后发送到目的地。 UDP不保证UDP数据报会到达其最终目的地, 不保证各个数据报的先后顺序跨网络后保持不变, 也不保证每个数据报只到达一次。

每个UDP数据报都有一个长度。 如果一个数据报正确地到达其目的地, 那么该数据报的长度将随数据一道传递给接收端应用进程。 我们已经提到过TCP是一个字节流(byte-stream) 协议, 没有任何记录边界(见1.2节) , 这一点不同于UDP。

4、TCP ⭐️

其次, TCP还提供了可靠性(reliability) 。 当TCP向另一端发送数据时, 它要求对端返回一个确认。 如果没有收到确认, TCP就自动重传数据并等待更长时间。 在数次重传失败后, TCP才放弃。

TCP含有用于动态估算客户和服务器之间的往返时间(round-trip time, RTT) 的算法, 以便它知道等待一个确认需要多少时间。

TCP提供流量控制(flow control) 。 TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据, 这称为通告窗口(advertised window) 。

4.1、TCP的连接的建立和终止(详细内容见书上)

TCP连接建立:TCP的三路握手。
chapter02_传输层_TCP_UDP_SCTP

TCP连接终止:TCP连接关闭时的分组交换.

chapter02_传输层_TCP_UDP_SCTP

状态转换图

chapter02_传输层_TCP_UDP_SCTP

5、SCTP

一个连接只涉及两个IP地址之间的通信。 一个关联指代两个系统之间的一次通信。

SCTP能够在所连接的端点之间提供多个流, 每个流各自可靠地按序递送消息。 一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。

SCTP还提供多宿特性, 使得单个SCTP端点能够支持多个IP地址。 该特性可以增强应对网络故障的健壮性。

附录

1、套接字对

一个TCP连接的套接字对(socket pair) 是一个定义该连接的两个端点的四元组: 本地IP地址、 本地TCP端口号、 外地IP地址、 外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接。

标识每个端点的两个值(IP地址和端口号) 通常称为一个套接字。