Python 网络编程之TCP详细讲解

【一】传输层

【1】概念

  • 传输层是OSI五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务
  • 主要协议包括**TCP(传输控制协议)UDP(用户数据报协议)**

【2】功能

  • **端到端通信:**传输层负责在源和目标主机之间建立、维护和终止通信。
  • 分段和重组: 将上层应用层传递下来的数据进行分段,以适应网络的传输要求,并在目标主机上将这些分段重组成完整的消息。
  • 错误检测与纠正: 提供可靠的数据传输,通过序号、确认和重传等机制实现。

【3】协议

  • TCP(传输控制协议): 提供可靠、面向连接的服务。通过三次握手建立连接,使用序号和确认号来保证数据的可靠传输,还包括流量控制和拥塞控制等机制。
  • UDP(用户数据报协议): 提供无连接、不可靠的服务。适用于对实时性要求较高的应用,如音频和视频传输。UDP较轻量,但不提供数据的可靠性和顺序性。

【4】端口

  • 传输层使用端口来标识不同的应用程序。端口分为源端口和目标端口,用于区分同一主机上的不同应用和区分不同主机上的应用。
  • TCPUDP协议都使用端口号,共有65535个端口号,其中0到1023号为众所周知的端口号,用于标识一些常见的服务。

【二】TCP协议

【1】三次握手

(1)理解过程
  • 握手是为了建立连接,建立连接是建立通道的过程,连接应该是双向的,需要发送请求和同意请求,那么理论上来说至少需要四次沟通交流才能建立连接,那为什么说是三次握手呢?
  • 我们画图来说一说:

请添加图片描述

  • 四次握手过程:
    • time0时,客户端向服务端发送连接请求
    • time1时,服务端收到了客户端发来的连接请求,此时返回同意连接的信息
    • time2时,客户端收到了服务端的同意信息,那么此时客户端向服务端发送信息的通道建成
    • time3时,服务端又需要向客户端发送消息,但是向客户端发送信息的通道并没有建成,所以向客户端发送连接请求
    • time4时,客户端收到连接请求,向服务端发送了同意信息
    • time5时,服务端收到同意信息,那么此时服务端向客户端发送信息的通道建成,双方都可以互相发送消息
  • 网络传输需要时效性,这四次握手中是不是有个很明显的浪费时间过程,服务端同意连接的时候不是也可以发发送连接吗?所以三次握手来了
  • 三次握手过程:
    • time0时,客户端向服务端发送连接请求
    • time1时,服务端收到了客户端发来的连接请求,此时返回同意连接的信息(同意客户端可以向服务端发送信息),但是服务端也需要向客户端发送信息,所以跟着发送了向客户端连接的请求
    • time2时,客户端收到了服务端同意的信息,那么客户端向服务端发送消息的通道建立完成,还看到了服务端的连接请求,所以又向服务端发送了同意连接的信息
    • time3时,服务端收到了同意连接的信息,此时双方就可以互相发送信息了
(2)正式讲解

请添加图片描述

  • 特殊文字说明:

    • SYN表示同步请求,seq表示序列号
    • ACK表示确认通知,ack表示确认号
  • 三次握手的详细步骤

    • 第一次握手:
      • 客户端向服务端发送一个TCP报文,标志位设置为SYN,表示发送连接请求
      • 报文包含一个初始序列号(ISN),用于后续数据的序列化
    • 第二次握手:
      • 服务端接收到客户端的SYN报文后,回复一个TCP报文,标志位设置为SYN和ACK
      • 报文中包含服务端的初始序列号(ISN)和确认号(ACK),确认号是客户端的序列号加一
    • 第三次握手:
      • 客户端接收到服务端的SYN和ACK报文后,向服务端发送一个TCP报文,标志位设置为ACK
      • 报文中的确认号(ACK)设置为服务端的序列号加一,还有收到的确认号当作序列化返还回去
  • 为什么要三次握手

    • 第一次握手是客户端告诉服务端他想建立连接,同时告知自己的初始序列号
    • 第二次握手是服务端收到请求后同意建立连接,并提供自己的初始序列号
    • 第三次握手是客户端收到同意后再次确认,确保双方都正确同步了序列号,连接可以安全建立

【2】四次挥手

(1)理解过程
  • 挥手是断开连接的过程,那么正常来说也应该要有四次挥手,连接的过程中可以时间优化只需要三次即可,那么为什么说是四次挥手呢?
  • 因为在服务端收到要断开的请求时,可以先向客户端发送同意断开的信息,让客户端到服务端的信息通道先关闭;但是此时服务端向客户端发送信息的通道任然可能还有数据信息在传输,此时这个通道是不能关闭的,需要服务端完成向客户端发送的所有内容,才可以关闭这条通道
(2)正式讲解

请添加图片描述

  • 四次挥手详细步骤
    • 第一次挥手:
      • 客户端向服务端发送一个TCP报文,标志位设置为FIN,表示客户端不再发送数据
      • 客户端进入FIN_WAIT_1状态,等待服务端的确认
    • 第二次挥手:
      • 服务端收到客户端发来的FIN报文后,回复一个TCP报文,标志位设置为ACK,确认客户端的FIN
      • 服务端进入CLOSE_WAIT状态,表示接收到了关闭连接的请求
    • 第三次挥手:
      • 服务端向客户端发送一个TCP报文,标志位设置为FIN和ACK,表示服务端也不在发送数据
      • 服务端进入LAST_ACK状态,等待客户端的最后确认
    • 第四次挥手:
      • 客户端接收到服务端的FIN报文后,回复一个TCP报文,标志位设置为ACK,确认服务端的FIN
      • 客户端进入TIME_WAIT状态,等待可能可能出现的延迟报文

【三】UDP协议

  • UDP是一种无连接、简单、轻量级的传输层协议

  • TCP不同,UDP不提供连接的可靠性和流控制,而是专注于尽可能快速地传输数据

  • 适用场景:实时音频和视频传输、在线游戏等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HackerGPTWhiteRabbitNeo的使用及体验对比

1. 简介 WhiteRabbitNeo(https://www.whiterabbitneo.com/)是基于Meta的LLaMA 2模型进行特化的网络安全AI模型。通过专门的数据训练,它在理解和生成网络安全相关内容方面具有深入的专业能力,可广泛应用于教育、专业培训和安全研究…

什么是非电离辐射与电离辐射?

摘要: 非电离辐射和电离辐射是两种不同类型的辐射,它们主要区别在于能量水平和与物质相互作用的方式。 非电离辐射 非电离辐射是指能量较低,不足以使原子或分子的电子脱离其原子核束缚而产生电离现象的电磁波。这类辐射不 ... 非电离辐射和电离辐射是两…

Centos 更换内核

文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一:通过启动菜单更换内核方法二:更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

面试题:你知道 Spring lazy-init 懒加载的原理吗?

文章目录 前言一、先睹为快二、原理分析三、总结 前言 普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站:topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池:一个管理线程的池子。 为什么平时都是使用线程池创建线程,直接new一个线程不好吗? 嗯,手动创建线程有两个缺点 不受控风险频繁创…

SpringBoot基础:一步步创建SpringBoot工程

摘要 本文介绍了,从零开始创建SpringBoot工程,且在每一步给出分析和原因。创建maven – 转Springboot – 引入jdbc – 引入数据库操作框架,最后给出了不同场景指定不同配置文件的方案。 背景 为什么要使用SpringBoot工程? 使用Sp…

Python 网络编程之粘包问题

【一】粘包问题介绍 【1】粘包和半包 粘包: 定义: 粘包指的是发送方发送的若干个小数据包被接收方一次性接收,形成一个大的数据包。原因: 通常是因为网络底层对数据传输的优化,将多个小数据包组合成一个大的数据块一次…

Linux搭建和使用redis

官网地址:http://redis.io/download 文件上传到服务器 tar包解压 tar zxvf redis-5.0.14.tar.gz安装 进入解压目录下,找到Makefile所在目录,执行make命令 make执行之后,会产生src等目录,进入执行make install命令…

locust快速入门--使用分布式提高测试压力

背景: 使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因: 如果你是通过命令行启动的或者参考之前文章的启动方式…

【论文阅读】Speech Driven Video Editing via an Audio-Conditioned Diffusion Model

DiffusionVideoEditing:基于音频条件扩散模型的语音驱动视频编辑 code:GitHub - DanBigioi/DiffusionVideoEditing: Official project repo for paper "Speech Driven Video Editing via an Audio-Conditioned Diffusion Model" paper&#…

第十讲 单片机驱动彩色液晶屏 控制RA8889软件:图像运算

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

大模型理论基础1

大模型理论基础1 第一章:引言 语言模型 自回归语言模型 概率的链式法则: 在自回归语言模型 p 中生成整个序列 X1:L,我们需要一次生成一个令牌(token),该令牌基于之前以生成的令牌进行计算获得: 其中T≥0 是一个控…

Java 日志体系泣血总结

目录 一. 前言 二. Log 日志体系 2.1. 背景/发展史 2.2. 关系/依赖 2.2.1. JCL(Jakarta Commons Logging) 2.2.2. SLF4J 2.2.3. SLF4J 的适配 2.2.4. Spring 统一输出 三. 总结 一. 前言 本文的目的是搞清楚 Java 中各种日志 Log 之间是怎样的关…

【深入理解 ByteBuf 之三 接口类拆解】2. Recycler 接口设计真正的回收机制

Recycler 回收器接口设计 本节接着 ObjectPool 的设计脉络,具体看看其具体实现 RecyclerObjectPool 中引用的 Recycler 究竟是怎么实现的 这一张图基本已经说明白了,我再做个总结,对细节感兴趣的可以看看我下面带源码的注释。 对于 Recycle…

2023.1.15 关于 Redis 持久化 RDB 策略详解

目录 Redis 持久化 Redis 实现持久化的两大策略 RDB 策略 手动触发 save 命令 bgsave 命令 bgsave 命令执行流程 自动触发 rdb 文件 实例演示一 实例演示二 实例演示三 实例演示四 RDB 策略的优缺点 Redis 持久化 什么是持久化? 回答: 将数据存…

SeaTunnel 海量数据同步工具的使用(连载中……)

一、概述 SeaTunnel 是一个非常易用,高性能、支持实时流式和离线批处理的海量数据处理产品,前身是 WaterDrop (中文名:水滴),自 2021年10月12日更名为 SeaTunnel 。2021年12月9日,SeaTunnel 正式…

【Linux】Linux系统编程——pwd命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 pwd(Print Working Directory)命令用于显示用户当前工作目录的完整路径。这是一个常用的命令,帮助用户确定他们目前所在的目录位置。 2.命令格式 基本的 pwd 命令…

STM32 USB OTG主机模式的实现方法

为了实现STM32的USB OTG主机模式,我们首先需要了解一些基本概念和原理,然后进行相应的硬件连接和软件编程。在这篇文章中,我们将介绍如何在STM32微控制器上实现USB OTG主机模式,并提供相应的代码示例。 1. STM32 USB OTG主机模式…

MyBatis 查询数据库

一. MyBatis 框架的搭建 本篇所用sql 表: drop table if exists userinfo; create table userinfo(id int primary key auto_increment,username varchar(100) not null,password varchar(32) not null,photo varchar(500) default ,createtime timestamp default current_tim…