4.1 TCP 连接

本文详细介绍了TCP连接的工作原理,包括TCP如何为HTTP提供可靠的比特传输管道,数据如何通过IP分组传输,以及如何通过端口号保持连接。TCP连接由4个值(源和目的IP地址、端口号)唯一识别,套接字API隐藏了TCP和IP的底层细节,简化了TCP编程。
  • 基本概念见1.5 连接
  • 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的,TCP/IP 是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。
  • 一旦连接建立起来了,在客户端和服务器的计算机之间交换的报文就永远不会丢失、受损或失序。尽管报文不会丢失或受损,但如果计算机或网络崩溃了,客户端和服务器之间的通信仍然会被断开。在这种情况下,会通知客户端和服务器通信中断了。
  • 建立连接步骤:
    这里写图片描述

1. TCP 的可靠数据管道

  • HTTP 连接实际上就是 TCP 连接及其使用规则。
  • TCP 为 HTTP 提供了一条可靠的比特传输管道。从 TCP 连接一端填入的字节会从另一端以原有的顺序、正确地传送出来。TCP 会按序、无差错地承载 HTTP 数据。
    这里写图片描述

2. TCP 流是分段的、由IP分组传送

  • TCP 的数据是通过名为 IP 分组(或 IP 数据报)的小数据块来发送的。
  • HTTP 就是“HTTP over TCP over IP”这个“协议栈”中的最顶层了。其安全版本 HTTPS 就是在 HTTP 和 TCP 之间插入了一个(称为 TSL 或 SSL 的)密码加密层。
  • HTTP 和 HTTPS 网络协议栈:
    这里写图片描述
  • HTTP 要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的 TCP 连接按序传输。TCP 收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在 IP 分组中,通过因特网进行传输(见下图)。所有这些工作都是由 TCP/ IP 软件来处理的,HTTP 程序员什么都看不到。
    这里写图片描述
  • 每个 TCP 段都是由 IP 分组承载,从一个 IP 地址发送到另一个 IP 地址的。每个 IP 分组中都包括:
    • 一个 IP 分组首部(通常为20字节),包含了源和目的 IP 地址、长度和其他一些标记;
    • 一个 TCP 段首部(通常为 20 字节),包含了 TCP 端口号、TCP 控制标记,以及用于数据排序和完整性检查的一些数字值;
    • 一个 TCP 数据块(0 个或多个字节)。

3. 保持 TCP 连接持续不断运行

  • 在任意时刻计算机都可以有几条 TCP 连接处于打开状态。TCP 是通过端口号来保持所有这些连接持续不断地运行。
  • IP 地址可以将你连接到正确的计算机,而端口号则可以将你连接到这台计算机上的正确的应用程序上去。
  • TCP 连接是通过 4 个值来识别的:< 源 IP 地址、源端口号、目的 IP 地址、目的端口号 >。这一组值称为套接字。这 4 个值一起唯一地定义了一条连接。两条不同的 TCP 连接不能拥有 4 个完全相同的地址组件值(但不同连接的部分组件可以拥有相同的值)。
  • 举例:
    有 4 条连接:A、B、C 和 D。注意,有些连接共享了相同的目的端口号(C 和 D 都使用目的端口号 80)。有些连接使用了相同的源 IP 地址(B 和 C)。有些使用了相同的目的 IP 地址(A 和 B,C 和 D)。但没有两个不同连接所有的 4 个值都一样。
    这里写图片描述
连接源IP地址源端口目的IP地址目的端口
A209.1.32.342034204.62.128.584133
B209.1.32.353227204.62.128.584140
C209.1.32.353105207.25.71.2580
D209.1.33.895100207.25.71.2580

4. TCP 套接字程序

  • 操作系统提供了一些操纵其 TCP 连接的工具。为了更具体地说明问题,我们来看一个 TCP 编程接口:套接字程序。
  • 套接字(socket):源IP地址和目的IP地址以及源端口号和目的端口号的组合。
  • 下表显示了套接字 API 提供的一些主要接口。这个套接字 API 向 HTTP 程序员隐藏了 TCP 和 IP 的所有细节。套接字 API 最初是为 Unix 操作系统开发的,但现在几乎所有的操作系统和语言中都有其变体存在。
套接字API调用描述
s = socket()创建一个新的、未命名、未关联的套接字
bind(s,)向套接字赋一个本地端口号和接口
connect(s, )创建一条连接本地套接字与远程主机及端口的连接
listen(s,…)标识一个本地套接字,使其可以合法接受连接
s2 = accept(s)等待某人建立一条到本地端口的连接
n = read(s, buffer, n)尝试从套接字向缓冲区读取 n 个字节
n = write(s, buffer, n)尝试从缓冲区中向套接字写入 n 个字节
close(s)完全关闭 TCP 连接
shutdown(s,)只关闭 TCP 连接的输入或输出端
getsockopt(s,…)读取某个内部套接字配置选项的值
setsockopt(s,…)修改某个内部套接字配置选项的值
  • 套接字 API 允许用户创建 TCP 的端点数据结构,将这些端点与远程服务器的 TCP 端点进行连接,并对数据流进行读写。TCP API 隐藏了所有底层网络协议的握手细节,以及 TCP 数据流与 IP 分组之间的分段和重装细节。
  • 通过套接字 API 来凸显客户端和服务器在实现 HTTP 事务时所应执行的步骤:
    这里写图片描述
### 配置 TCP 连接的本地 IP 和指定端口 #### 使用编程方法绑定特定本地 IP 地址和端口 为了在不同的网络适配器上建立具有明确本地 IP 的 TCP 连接,可以在程序中利用套接字 API 显式地指定期望使用的 IP 地址与端口号。以下是基于 Python 编程语言的具体实现: ```python import socket def configure_tcp_connection(interface_ip, port): """ 创建一个绑定到指定IP地址和端口的TCP服务器。 参数: interface_ip (str): 要绑定的本地IP地址。 port (int): 要监听的端口号。 返回: socket.socket: 已经绑定好的套接字实例。 """ server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: server_socket.bind((interface_ip, port)) server_socket.listen(5) # 设置最大等待队列长度为5 print(f"Server is listening on {interface_ip}:{port}") except Exception as e: print(f"Error binding to {interface_ip}:{port}: {e}") raise return server_socket # 对应不同网络接口分别创建TCP连接 server_vmnet1 = configure_tcp_connection('192.168.195.1', 8080)[^1] server_vmnet8 = configure_tcp_connection('192.168.58.1', 9090)[^2] server_wlan = configure_tcp_connection('192.168.4.106', 10000)[^3] while True: client_conn, addr = server_vmnet1.accept() or server_vmnet8.accept() or server_wlan.accept() print(f"Incoming connection from {addr}") ``` 以上脚本展示了如何针对 VMware Network Adapter VMnet1、VMnet8 和 WLAN 三个独立的网络设备各自设定独特的 TCP 监听服务[^1]^。 #### 手动配置静态 IP 并测试连通性 除了通过软件开发手段动态调整外,还可以手动更改每张网卡对应的参数以适应实际需求。例如,在 Windows 系统里右键点击对应网络图标进入属性界面后找到“Internet 协议版本 4(TCP/IPv4)”选项进行编辑;或者是在 Linux 下直接修改 `/etc/network/interfaces` 文件或使用命令行工具如 `ifconfig`, `ip addr add ... dev ethX` 来达到同样效果[^4]。 另外值得注意的一点是,默认情况下这些虚拟网络可能并未开启路由功能使得它们之间无法互相通信除非特别设置了防火墙规则允许此类行为发生[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值