【面试】【详解】计算机网络(TCP 三次握手,四次挥手)

news/2025/2/1 6:01:09/

一、计算机网络详解

  • (一)计算机网络概述

  • 定义计算机网络是通过传输介质将多台计算机连接起来,以实现数据通信和资源共享的系统。

  • 功能:

    • (1) 数据通信:实现不同设备之间的数据传输。

    • (2) 资源共享:硬件资源(如打印机)和软件资源(如数据库)共享。

    • (3) 分布式处理:多台计算机协作完成任务。


  • (二)TCP 三次握手

  • 1. 定义
  • TCP(三次握手)是建立可靠连接的重要步骤,确保双方准备好通信并初始化必要的参数。

  • 2. 过程详解
  • 第一次握手(SYN):

    • 客户端向服务器发送一个 SYN(synchronize)报文,表明希望建立连接。
    • 此时,客户端进入 SYN-SENT 状态。
  • 第二次握手(SYN + ACK):

    • 服务器收到 SYN 后,回复一个 SYN + ACK 报文,表示接收到请求并同意建立连接。
    • 服务器进入 SYN-RECEIVED 状态。
  • 第三次握手(ACK):

    • 客户端收到 SYN + ACK 后,发送 ACK 报文,表示确认。
    • 客户端和服务器进入 ESTABLISHED 状态,连接正式建立。
  • 3. 为什么需要三次握手?
  • 确保双方都能(收,发)数据,就是将双方四个状态都确定:

    • (1) 第一次握手客户端发送数据,确认自己可以发送
    • (2) 第二次握手服务器接收到数据,确认自己可以接收,同时告知客户端可以发送
    • (3) 第三次握手客户端确认自己可以接收数据
  • 防止服务器资源浪费:如果仅两次握手,可能导致服务器误认为已建立连接,浪费资源。

  • 4. 代码示例(Socket 编程)
    import socket# 服务端代码
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("127.0.0.1", 8080))
    server.listen(1)
    print("等待客户端连接...")
    conn, addr = server.accept()
    print(f"连接已建立: {addr}")# 客户端代码
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("127.0.0.1", 8080))
    print("连接成功")
    

  • (三)TCP 四次挥手

  • 1. 定义
  • 四次挥手是关闭 TCP 连接的步骤,确保双方的数据传输完全结束。

  • 2. 过程详解
  • 第一次挥手(FIN):

    • 客户端发送 FIN(finish)报文,表示不再发送数据。
    • 客户端进入 FIN-WAIT-1 状态。
  • 第二次挥手(ACK):

    • 服务器收到 FIN 后,回复一个 ACK 报文,表示已收到请求。
    • 服务器进入 CLOSE-WAIT 状态。
  • 第三次挥手(FIN):

    • 服务器发送 FIN 报文,表示不再发送数据。
    • 服务器进入 LAST-ACK 状态。
  • 第四次挥手(ACK):

    • 客户端收到 FIN 后,回复一个 ACK 报文。
    • 客户端进入 TIME-WAIT 状态,确保服务器收到 ACK 后关闭。
  • 3. 为什么需要四次挥手?
  • TCP 是全双工通信:双方需要单独关闭发送和接收通道。

  • 确保数据完全传输:通过分阶段关闭,防止未传输的数据丢失。

  • 4. TIME-WAIT 状态的作用
  • 防止丢失的报文被误处理:等待一段时间确保所有报文从网络中消失。

  • 确保连接的完整关闭。

  • 5. 代码示例(Socket 编程)
    import socket# 服务端代码
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("127.0.0.1", 8080))
    server.listen(1)
    conn, addr = server.accept()
    print("连接已建立")
    conn.close()
    print("连接已关闭")# 客户端代码
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("127.0.0.1", 8080))
    print("连接成功")
    client.close()
    print("连接已关闭")
    

  • (四)UDP 与 TCP 的区别

    特性TCPUDP
    连接方式面向连接(三次握手)无连接
    可靠性提供可靠传输,确保数据无误不保证数据可靠性
    速度较慢(有流控与拥塞控制)快(无流控与拥塞控制)
    场景文件传输、HTTP、数据库等视频直播、DNS、游戏

  • (五)总结

  • 三次握手:建立连接,确保双方通信能力。

  • 四次挥手:断开连接,确保数据完整传输。

  • TCP 与 UDP:

    • TCP 提供可靠性,适用于需要严格保证数据正确的场景。

    • UDP 提供高效性,适用于实时性要求高的场景。

      通过深入理解 TCP/UDP 的机制,可以优化网络程序的设计,提高通信效率。


http://www.ppmy.cn/news/1568352.html

相关文章

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…

MySQL(高级特性篇) 13 章——事务基础知识

一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 (1)存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些,以及这些存储引擎是否支持事务能看出在MySQL中,只有InnoDB是支持事务的 &#x…

RabbitMQ 匿名队列详解

在小组代码 Review 时,讨论到了 RabbitMQ 的匿名队列,于是去网上查了下关于匿名队列的内容,并记录下来。 匿名队列是一种特殊的临时队列,在消息传递过程中有着独特的用途,匿名队列也被称为临时队列,它没有…

Java CAS操作

通过前面的学习认识到了CPU缓存,Java内存模型,以及线程安全的原子、可见、顺序三大特性。本文则重点认识CAS操作,这是Java并发编程常见的一个操作,AbstractQueuedSynchronizer基于此操作提供了丰富的同步器和各种锁。 目录 CAS&am…

从新手到高手的蜕变:MySQL 视图进阶全攻略

一、视图是什么 视图是一种虚拟表,它并非像普通表那样实际存储数据,而是基于 SQL 查询语句定义的。视图是从一个或多个基表(实际存在的物理表)或其他视图中导出的结果集。可以将其视为一个预定义的查询,当执行针对视图…

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…

游戏开发领域 - 游戏引擎 UE 与 Unity

游戏引擎 游戏引擎是用于开发电子游戏的软件框架,它提供图形渲染、物理模拟、音频处理、动画系统、脚本编写等功能,帮助开发者高效创建电子游戏 但是,游戏引擎也不仅限于游戏开发,还广泛应用于其他领域,例如&#xff…

kafka-部署安装

一. 简述: Kafka 是一个分布式流处理平台,常用于构建实时数据管道和流应用。 二. 安装部署: 1. 依赖: a). Java:Kafka 需要 Java 8 或更高版本。 b). zookeeper: #tar fxvz zookeeper-3.7.0.tar.gz #…