Python面向对象-网络编程(上)
2025-9-16
| 2025-9-26
Words 8682Read Time 22 min
type
status
date
slug
summary
tags
category
icon
password

📝 网络基础

1、核心网络设备

1.1、交换机

  • 角色局域网(LAN)的交通警察
  • 工作层级:主要工作在数据链路层(二层)。
  • 功能:它的核心任务是在同一个网络内部(例如,同一个办公室或楼层)高效地连接多台设备(电脑、打印机、摄像头等)。它通过识别设备的MAC地址,将数据帧准确地转发给目标设备,而不是广播给所有设备。
  • 简单比喻:像一个高效的办公室内部邮件分拣员。他知道每个工位(MAC地址)上的人是谁,收到信件(数据)后,能直接投递到正确的工位,不会打扰其他人。

1.2、路由器

  • 角色不同网络之间的网关和导航员
  • 工作层级:工作在网络层(三层)。
  • 功能:它的核心任务是连接不同的网络,并在它们之间转发数据包。它通过识别IP地址,决定数据包的最佳路径,将其从一个网络(如你家网络)发送到另一个网络(如互联网)。
  • 主要能力
    • 分配IP地址(通过DHCP服务)。
    • 网络地址转换(NAT):让你家中的所有设备共用同一个公共IP地址上网。
    • 防火墙:提供基本的安全防护,过滤不必要的流量。
  • 简单比喻:像一个邮局的 sorting center(分拣中心)。它查看信封上的邮政编码(IP地址),决定这封信是留在本市(局域网)还是发往另一个城市(另一个网络/互联网)。

1.3、三层交换机

  • 角色交换机和路由器的结合体
  • 工作层级:同时具备数据链路层(二层)和网络层(三层)的功能。
  • 功能:它本质上是一个带有路由功能的高速交换机。主要用于大型局域网内部需要高速路由的场景(例如,在不同部门或VLAN之间进行数据交换)。它能用硬件的速度完成路由功能,比“路由器+交换机”的方案更快。
  • 简单比喻:像一个兼具内部邮件分拣员和跨部门邮件通道管理员的超级员工。他既能快速在部门内投递信件(交换),又能高速地处理不同部门之间的信件往来(路由),效率极高。

1.4、小结

设备
工作范围
核心标识
比喻
交换机
同一个网络内部
MAC地址
办公室邮件分拣员
路由器
不同网络之间
IP地址
邮局分拣中心
三层交换机
大型局域网内部的不同网段
MAC & IP地址
超级管理员(交换+路由)

2、常见网络架构

notion image

2.1、小型企业基础网络架构

典型的架构是 “三层结构”
  1. 接入层:最底层,连接终端用户设备(电脑、IP电话等)。使用普通交换机
  1. 汇聚层:中间层,连接接入层交换机。通常使用三层交换机,用于处理企业内部不同VLAN(虚拟局域网,如财务部、销售部)之间的路由、访问控制策略等。
  1. 核心层:网络骨干,连接汇聚层交换机、企业服务器、以及路由器。追求高速和高可靠性。
  1. 出口:企业边界的路由器/防火墙,连接互联网。
数据流向:电脑 -> 接入层交换机 -> 汇聚层(三层交换机)-> (如需访问外网)核心层 -> 出口路由器 -> 互联网。

2.2、家庭网络架构

结构非常简单,通常所有功能集成在一个设备上:
  • 核心设备无线路由器(集成了路由器、交换机、Wi-Fi接入点和防火墙功能)。
  • 连接方式
    • 有线设备(如台式机、智能电视)通过网线连接到路由器后方的交换机端口上。
    • 无线设备(手机、笔记本)通过Wi-Fi连接到路由器。
  • 出口:路由器通过WAN口连接至光猫/调制解调器,最终接入互联网服务提供商(ISP)的网络。

2.3、互联网

  • 本质网络的网络
  • 构成:全球无数个自治网络(ISP、公司、学校、数据中心网络)通过路由器相互连接而成的巨大集合。
  • 运作方式:没有中央控制。数据被分割成数据包,每个包都包含目标IP地址。路由器之间通过BGP等路由协议相互通信,共享路径信息,像传递接力棒一样,共同协作将数据包从源地址路由到目标地址。

3、网络核心词汇

3.1、IP地址与子网掩码

1. IP地址
  • 是什么设备的网络“门牌号”。就像每栋房子有一个唯一的地址用来收寄信件一样,网络上的每台设备(电脑、手机、服务器等)都需要一个唯一的IP地址来收发数据。
  • 格式:通常表现为四组用点分开的数字(如 192.168.1.10),这称为IPv4。
  • 作用:用于标识和定位网络上的设备,是数据传输的“目的地”和“发件人”。
2. 子网掩码
  • 是什么定义IP地址的“社区范围”。它用来区分一个IP地址中哪部分是网络号(代表整个社区),哪部分是主机号(社区里的具体门牌)。
  • 格式:看起来和IP地址类似(如 255.255.255.0)。
  • 作用:判断两台设备是否在同一个本地网络(子网) 内。
    • 例子:设备A (192.168.1.10) 和设备B (192.168.1.20) 的子网掩码都是 255.255.255.0
      • 通过计算可知,它们属于同一个网络192.168.1.0)。它们之间的通信直接通过交换机完成,速度快。
    • 设备C (192.168.2.30) 和它们子网掩码相同,但网络号是 192.168.2.0,属于不同网络。它们通信需要经过路由器转发。
简单比喻:
  • IP地址中国-北京市-海淀区-XX路-100号
  • 子网掩码255.255.255.0 就像说“前三个部分(中国-北京市-海淀区)是网络区域,最后一部分(100号)是具体主机”。
  • 同子网设备通信,就像在同一栋楼里喊话;不同子网设备通信,就像需要邮局在不同城市间寄信。

3.2、DHCP

  • 是什么动态主机配置协议。它是一个自动化的网络管理员
  • 作用:自动为网络中的设备分配IP地址、子网掩码、网关地址(路由器地址)和DNS服务器地址。
  • 好处:你不需要手动为每台电脑、手机设置IP地址,插上网线或连上Wi-Fi就能上网,非常方便。家庭路由器就内置了DHCP功能。
简单比喻:像一个公司的前台,新员工(新设备)入职(接入网络)时,前台自动给他分配一个工位号(IP地址)并告诉他经理(网关)在哪。

3.3、内网(私有)IP 与 公网IP

  • 内网(私有)IP地址
    • 范围:专门预留的一些地址段(如 192.168.x.x10.x.x.x172.16.x.x - 172.31.x.x)。
    • 作用:在家庭、公司等内部网络使用。它们不能直接在互联网上被访问。
    • 特点:可以重复使用。你家路由器分配的是 192.168.1.x,我家路由器也可以分配同样的地址,互不冲突。
  • 公网IP地址
    • 范围:除内网IP外的所有地址。
    • 作用:在全球互联网上唯一标识一个设备。是你在互联网上的“身份证”。
    • 特点:全球唯一,需要向运营商购买/租用。
它们如何协同工作:
你家所有设备都使用内网IP(如 192.168.1.100)。当你访问百度时,数据包到达路由器,路由器会进行NAT(网络地址转换),把你的内网IP换成路由器的公网IP再发出去。返回的数据包也是先到路由器,再由路由器转发给你的设备。
简单比喻:
  • 公网IP:你公司的总机号码(只有一个,对外公开)。
  • 内网IP:公司内部各个分机号(如 101102,可以和其他公司的分机号重复)。
  • 外线电话打进来,总机(路由器)需要转接到正确的分机(你的电脑)。

3.4、云服务器

  • 是什么一台放在远数据中心、可以通过互联网远程访问的虚拟电脑
  • 与传统服务器的区别:你不需要自己购买和维护物理硬件。服务商(如阿里云、AWS)提供网页界面,让你可以按需、灵活地租用计算能力、存储空间和网络资源,用时付费,不用就关掉。
  • 用途:搭建网站、运行应用程序、存储数据、数据分析等。
简单比喻:从“自己发电”变成了“从国家电网用电”。你不用自己买发电机、维护发电机,只需按用电量付费,随时可用,弹性伸缩。

3.5、端口

  • 是什么一台设备上的“应用程序门牌号”。IP地址帮你找到了正确的“大楼”(设备),端口则帮你找到大楼里正确的“房间”(应用程序/服务)。
  • 格式:一个16位的数字(0-65535)。
  • 作用:让一台设备可以同时运行多个网络应用(如一边浏览网页一边收邮件),而数据不会送错地方。
  • 常见端口
    • 80: HTTP (网页服务)
    • 443: HTTPS (加密的网页服务)
    • 25: SMTP (邮件发送)
    • 21: FTP (文件传输)
简单比喻:IP地址是公司的地址,端口是公司的部门分机号(如销售部请按101,技术支持请按102)。

3.6、域名

  • 是什么IP地址的“好记别名”。因为人类很难记住一串数字(如 142.251.42.206),但很容易记住名字(如 google.com)。
  • 作用:方便人们访问网站和服务。
  • 如何工作:当你浏览器输入 google.com 时,它会先去问 DNS服务器(像一本巨大的电话簿),DNS服务器会查询到这个名字对应的真实IP地址(142.251.42.206),然后浏览器才能通过IP地址找到谷歌的服务器。
简单比喻域名是手机通讯录里的联系人姓名,IP地址是Ta的电话号码。你想打电话给“张三”,不需要背出他的号码,只需在通讯录里找名字,手机自动帮你拨号。

📝 OSI 7层模型

notion image

1、什么是OSI七层模型?

OSI(开放系统互联)模型是一个由国际标准化组织(ISO)提出的概念性框架,用于描述网络通信过程中,不同计算机系统之间如何相互连接和通信。它将复杂的网络通信过程分解为七个更小、更易于管理的层。
核心思想:每一层都为其上一层提供服务,并调用下一层的服务。同时,每一层都遵循特定的协议和标准,层与层之间通过清晰的接口进行交互。这种分层结构使得网络设计、故障排除和协议开发都变得更加模块化和简化。

2、七层结构详解(从下到上)

OSI层数
名称
功能简介
协议数据单元(PDU)
常见协议/设备
第7层
应用层
为用户应用程序提供网络服务接口
Message(消息)
HTTP, HTTPS, FTP, SMTP, DNS, Telnet
第6层
表示层
数据翻译、加密解密、压缩解压缩
SSL/TLS, JPEG, MPEG, GIF
第5层
会话层
建立、管理、终止应用程序之间的会话
NetBIOS, RPC, SIP
第4层
传输层
提供端到端的可靠或不可靠数据传输
Segment(段)或 Datagram(数据报)
TCP, UDP
第3层
网络层
提供逻辑地址(IP)、路由和寻址
Packet(包)
IP, ICMP, IPSec, 路由器
第2层
数据链路层
提供介质访问、物理寻址(MAC)、差错校验
Frame(帧)
Ethernet, PPP, Switch, 网桥
第1层
物理层
传输原始比特流,定义电气、机械特性
Bit(比特)

3、各层详细功能说明

3.1、物理层

  • 功能:在物理介质上透明地传输比特流(0和1)。它定义了设备的物理特性,如电压水平、线缆规格、接口类型(如RJ45)、传输速率、最大距离等。
  • 比喻:就像公路本身,负责让车辆(比特流)能够行驶。它不关心车上装的是什么货,只关心路能不能走。
  • 设备:集线器(Hub)、中继器(Repeater)、调制解调器(Modem)、网线、光纤。

3.2、数据链路层

  • 功能
      1. 成帧:将来自网络层的包封装成,添加头部和尾部。
      1. 物理寻址:在帧的头部添加MAC地址(源MAC和目的MAC)。
      1. 差错控制:通过帧尾部的校验码(如CRC)检测传输过程中是否出现比特错误。
      1. 流量控制:控制发送速率,确保接收方不会被淹没。
      1. 介质访问控制:决定设备何时可以在共享介质(如以太网)上发送数据。
  • 比喻:就像交通规则和汽车牌照。它确保在一条公路上(同一局域网内),车辆能正确地找到对方,并且不发生碰撞。
  • 设备:交换机(Switch)、网桥(Bridge)。注意:交换机基于MAC地址转发数据,工作在第二层。

3.3、网络层

  • 功能
      1. 逻辑寻址:为设备分配IP地址,并封装到包的头部。IP地址是全局的、可路由的。
      1. 路由:根据目的IP地址,为数据包选择最佳路径,穿越不同的网络(从源网络到目标网络)。
      1. 拥塞控制:管理网络中的数据流量,避免网络过载。
  • 比喻:就像GPS导航和邮政系统中的邮政编码。它不关心本地地址(MAC地址),只关心如何将包裹从一个城市(网络)投递到另一个城市。
  • 设备路由器(Router)。路由器是连接不同网络的关键设备,基于IP地址进行转发。

3.4、传输层

  • 功能
      1. 端到端通信:提供应用程序进程之间的逻辑通信(通过端口号标识不同应用,如80端口对应Web服务)。
      1. 服务类型:提供两种主要协议:
          • TCP:面向连接的、可靠的传输。提供确认、重传、流量控制和拥塞控制。
          • UDP:无连接的、不可靠但高效的传输。
      1. 分段与重组:将上层数据分割成更小的,并在接收端重新组装。
      1. 差错控制:确保数据完整、有序地到达。
  • 比喻:就像公司的收发室。它负责将公司(主机)内部不同部门(应用程序)的信件打包,并选择可靠的快递(TCP)或普通的平邮(UDP)寄出。

3.5、会话层

  • 功能:建立、管理和终止两个应用进程之间的会话(Session)。会话是持续较长时间的连接。
    • 例如:在传输一个大文件时,网络连接暂时中断,会话层可以在连接恢复后从中断点继续,而不必重新开始。
  • 比喻:就像电话接线员,负责拨号建立通话(会话),并在通话结束后挂断。

3.6、表示层

  • 功能:充当应用程序和网络之间的“翻译官”,确保一个系统应用层发出的信息能被另一个系统的应用层读懂。
      1. 数据转换:将数据从适合应用的格式转换为适合网络传输的格式,如编码转换(ASCII to Unicode)。
      1. 加密/解密:如SSL/TLS协议就在这一层开始工作。
      1. 压缩/解压缩:减少传输的数据量。
  • 比喻:就像同声传译,将一种语言(数据格式)翻译成另一种对方能理解的语言。

3.7、应用层

  • 功能:最靠近用户的一层,为应用程序提供网络服务接口。它并不是指应用程序本身(如Chrome浏览器),而是指应用程序用来实现网络功能的协议
    • 例如:使用浏览器时,它调用的是HTTP/HTTPS协议;发送邮件时,调用的是SMTP协议。
  • 比喻:就像你(用户)。你想做什么(浏览网页、发邮件),就直接使用相应的工具(协议)。

4、数据封装与解封装过程

4.1、发送端(封装过程 - 从上到下)

  • 用户在应用程序中输入数据(Data)。
  • 应用层:加上应用层头 → Message
  • 表示层:加上表示层头,进行加密/压缩等。
  • 会话层:加上会话层头。
  • 传输层:加上TCP/UDP头(含端口号) → Segment
  • 网络层:加上IP头(含IP地址) → Packet
  • 数据链路层:加上帧头(含MAC地址)和帧尾(CRC) → Frame
  • 物理层:将帧转换为比特流,通过物理介质发送出去。

4.2、接收端(解封装过程 - 从下到上)

  • 物理层:接收比特流。
  • 数据链路层:检查MAC地址和帧错误,去掉帧头和帧尾,将Packet上交。
  • 网络层:检查IP地址,决定是否路由,去掉IP头,将Segment上交。
  • 传输层:根据端口号将数据交给正确的应用程序,处理序列号和确认,去掉TCP/UDP头。
  • 会话层、表示层:管理会话,进行解密/解压等,逐层去掉头部。
  • 应用层:将原始的Data呈现给应用程序。

5、OSI模型 vs. TCP/IP模型

需要注意的是,OSI模型是一个理论模型,而现实中广泛使用的是更简化的TCP/IP模型(4层或5层)。它们的对应关系如下:
OSI七层模型
TCP/IP五层模型
TCP/IP四层模型
应用层、表示层、会话层
应用层
应用层
传输层
传输层
传输层
网络层
网络层
网际层
数据链路层、物理层
网络接口层
网络接口层

📝 UDP和TCP协议

1、UDP 和 TCP 概述

1.1、UDP(用户数据报协议)

UDP是一种简单的、无连接的传输层协议。
  1. 无连接:通信前不需要先建立连接,直接发送数据。这就像寄明信片,无需确认收件人地址是否正确、是否在家,直接投递即可。
  1. 不可靠:不提供数据包的确认、重传、排序机制。如果数据包在中途丢失、重复或乱序,UDP不会进行处理。
  1. 高效:因为不需要建立连接和维护复杂的控制机制,头部开销小(仅8字节),传输延迟低,速度快。
  1. 支持多播和广播:可以将数据包一次性发送给多个主机。
UDP报文头结构(8字节):
notion image
字段
长度
描述
Source Port
2字节
标识哪个应用程序发送(发送进程)。
Destination Port
2字节
标识哪个应用程序接收(接收进程)。
Length
2字节
UDP首部加上UDP数据的字节数,最小为8。
Checksum
2字节
覆盖UDP首部和UDP数据,是可选的。
data octets
变长
UDP负载,可选的。
  • 应用场景:适用于对传输延迟和速率敏感,但能容忍少量数据丢失的应用。
    • 音视频流媒体(直播、视频会议)
    • 在线游戏(实时状态同步)
    • DNS查询
    • TFTP(简单文件传输协议)
    • DHCP
核心总结:UDP 追求一个“快”字,简单粗暴,但不管“售后”。

1.2、TCP(传输控制协议)

TCP是一种复杂的、面向连接的、可靠的传输层协议。
  1. 面向连接:在数据传输之前,必须通过三次握手建立稳定的连接。传输结束后,通过四次挥手断开连接。这就像打电话,需要先拨号接通,通话结束后要礼貌道别并挂断。
  1. 可靠传输:通过以下机制确保数据准确无误地送达:
      • 确认和重传(ACK & Retransmission):接收方收到数据后会发送确认报文。发送方在一定时间内未收到确认,则会重传数据。
      • 序列号和确认号:每个字节的数据都被编号(序列号),确认号告知对方期望收到的下一个字节的编号。这解决了乱序重复问题。
      • 流量控制:通过滑动窗口机制,根据接收方的处理能力来调整发送速率,防止接收方缓冲区溢出。
      • 拥塞控制:通过复杂的算法(如慢启动、拥塞避免、快重传、快恢复)感知网络拥堵情况,动态调整发送速率,避免网络瘫痪。
TCP报文头结构(至少20字节):
notion image
字段
长度
含义
Source Port
16比特
源端口,标识哪个应用程序发送。
Destination Port
16比特
目的端口,标识哪个应用程序接收。
Sequence Number
32比特
序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
Acknowledgment Number
32比特
确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。
Data Offset
4比特
数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。
Reserved
6比特
保留,必须填0。
CWR
1比特
拥塞窗口减少标识
ECE
1比特
ECN回声标识
URG
1比特
紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
ACK
1比特
确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
PSH
1比特
标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。
RST
1比特
重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。
SYN
1比特
同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。
FIN
1比特
发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。
Window
16比特
窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端期望接收的字节数。窗口最大为65535字节。
Checksum
16比特
校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
Urgent Pointer
16比特
紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
Options
可变
选项字段。TCP协议最初只规定了一种选项,即最长报文段长度(只包含数据字段,不包括TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。 新的RFC规定有以下几种选型:选项表结束,空操作,最大报文段长度,窗口扩大因子,时间戳。 • 选项表结束。 • 空操作:没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。 • 最大报文段长度:又称为MSS,只包含数据字段,不包括TCP首部。 • 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。 • 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。
data
可变
TCP负载。
  • 应用场景:适用于要求数据完整、准确无误传输的应用。
    • Web浏览(HTTP/HTTPS)
    • 电子邮件(SMTP, POP3, IMAP)
    • 文件传输(FTP)
    • 远程登录(SSH)
核心总结:TCP 追求一个“稳”字,机制复杂,保证数据可靠交付。

2、TCP 的三次握手(连接建立)

notion image
目的:双方确认彼此的发送和接收能力正常,并同步初始序列号(ISN)。
假设客户端(Client)想要主动与服务器(Server)建立连接。
  1. 第一次握手(SYN)
    1. notion image
      • 客户端发送一个TCP报文。
      • 设置标志位 SYN=1,表示请求建立连接。
      • 选择一个初始序列号(ISN),例如 seq = x
      • 进入 SYN-SENT 状态。
  1. 第二次握手(SYN + ACK)
    1. notion image
      • 服务器收到客户端的SYN报文。
      • 如果同意连接,则回复一个TCP报文。
      • 设置标志位 SYN=1 和 ACK=1
      • 确认号字段设置为 ack = x + 1(表示期望收到下一个数据包的序列号是x+1)。
      • 同时为自己选择一个初始序列号,例如 seq = y
      • 进入 SYN-RCVD 状态。
  1. 第三次握手(ACK)
    1. notion image
      • 客户端收到服务器的SYN-ACK报文。
      • 向服务器发送一个确认报文。
      • 设置标志位 ACK=1
      • 序列号 seq = x + 1(因为第一次握手消耗了一个序列号)。
      • 确认号 ack = y + 1
      • 客户端进入 ESTABLISHED(连接已建立)状态。
      • 服务器收到这个ACK后,也进入 ESTABLISHED 状态。
至此,连接建立成功,双方可以开始传输数据。
为什么是三次,而不是两次?
主要目的是防止“已失效的连接请求报文”突然又传送到服务器,导致错误。
假设一种情况:客户端发送了一个SYN请求,但这个包在网络中滞留了(失效了)。客户端超时未收到回应,于是重发一个SYN并成功建立连接。结束后,那个滞留的SYN包终于到达了服务器。如果只有两次握手,服务器会认为这是一个新的连接请求,会直接回复SYN-ACK并进入连接状态,浪费服务器资源。而有了第三次握手,客户端不会理会这个陈旧的SYN-ACK,因此不会发送确认,服务器由于收不到确认,就不会建立连接。

3、TCP 的四次挥手(连接释放)

notion image
目的:双方都确认数据已发送完毕,可以安全地断开连接。TCP连接是全双工的,因此每个方向必须单独关闭。
假设客户端主动发起关闭。
  1. 第一次挥手(FIN)
      • 客户端的数据发送完毕后,应用层通知TCP要关闭连接。
      • 客户端发送一个TCP报文。
      • 设置标志位 FIN=1,并指定一个序列号,例如 seq = u
      • 客户端进入 FIN-WAIT-1 状态。
  1. 第二次挥手(ACK)
      • 服务器收到FIN报文后,立即回复一个确认报文。
      • 设置标志位 ACK=1
      • 确认号 ack = u + 1
      • 序列号为 seq = v(为自己之前发送的序列号)。
      • 服务器进入 CLOSE-WAIT 状态。此时,从客户端到服务器的连接就关闭了(即客户端不再发送数据,但服务器可能还有数据要发送)。
      • 客户端收到这个ACK后,进入 FIN-WAIT-2 状态。
  1. 第三次挥手(FIN)
      • 服务器将最后剩余的数据发送完毕后,也准备关闭连接。
      • 服务器发送一个TCP报文。
      • 设置标志位 FIN=1 和 ACK=1(通常还会顺带对之前的报文做一次确认)。
      • 指定一个序列号 seq = w(可能已经增长),确认号依然是 ack = u + 1
      • 服务器进入 LAST-ACK(最后确认)状态。
  1. 第四次挥手(ACK)
      • 客户端收到服务器的FIN报文后,必须发出确认。
      • 发送一个确认报文,设置 ACK=1
      • 序列号 seq = u + 1(因为第一次挥手消耗了一个序列号)。
      • 确认号 ack = w + 1
      • 客户端进入 TIME-WAIT 状态。等待2MSL(最大报文段生存时间)后,客户端才进入 CLOSED 状态。
      • 服务器只要收到这个ACK,就立即进入 CLOSED 状态。
为什么客户端最后需要等待2MSL?
保证最后一个ACK能到达服务器:如果服务器没有收到第四次挥手的ACK,它会重传第三次挥手的FIN报文。客户端在2MSL时间内收到这个重传的FIN,会重传ACK并重新计时2MSL。让本次连接产生的所有报文都在网络中消失:等待2MSL时间,足以使本次连接期间产生的所有报文都从网络中消亡,这样不会影响下一次新的连接。
为什么是四次挥手?
因为TCP连接是全双工的,关闭每个方向都需要一个FIN和一个ACK。当客户端发送FIN时,只表示它没有数据要发了,但还可以接收数据。服务器收到FIN后,可能还有数据要发送给客户端,所以它的ACK和FIN不能合并为一次发送,这就比三次握手多了一次。
 
  • PythonObject
  • Python面向对象-面向对象高级和应用Python面向对象-网络编程(下)
    Loading...