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不提供连接的可靠性和流控制,而是专注于尽可能快速地传输数据

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【点云、图像】学习中 常见的数学知识及其中的关系与python实操[更新中]

文章目录 前言一、平均值、方差、协方差平均值(mean)np.mean()方差(variance)np.var()总体方差 np.var(a, ddof0)无偏样本方差np.var(a, ddof1)有偏样本方差标准差(standard deviation)np.std(a, ddof1)默认…

【原创】docker +宝塔+安装zabbix

Zabbix: Zabbix可以监控各种网络服务、服务器和网络设备,而无需在目标设备上安装客户端。它的强大之处在于自带的Web界面,能够提供实时监控和各种报警功能。方法1: 步骤 创建Docker Compose文件: 首先,你需要创建一个docker-comp…

Elasticsearch Windows部署-ELK技术栈

1、下载Elasticsearch、kibana、logstash 本文不介绍ELK相关原理知识,只记录部署操作过程 下载地址Past Releases of Elastic Stack Software | Elastic 选择同一版本,这里选择是当前最新版本8.11.3 解压放在同目录下,方便后续操作与使用 …

基于Simdroid电子散热模块的电子设备机箱散热设计与优化

一、背景介绍 热设计就是通过合理的散热方式保证良好的热环境,确保电子设备可靠的工作。随着电子技术的迅速发展,电子设备的结构越来越复杂,且越来越趋于小型化,散热问题成为了影响设备可靠性的重要因素。据统计,电子…

三种引入CSS的方式

文章目录 CSS基础知识概述CSS的注释CSS的格式 三种引入CSS的方式内嵌式外链式行内式优先级 CSS基础知识 概述 Cascading Style Sheet 层叠样式表 前端三大基础之一(Html结构 CSS样式 JS动作) 最早由网景公司(Netscape)提出,在1996年受到w…

【51单片机系列】单片机与PC进行串行通信

一、单片机与PC机串行通信的设计 工业现场的测控系统中,常使用单片机进行监测点的数据采集,然后单片机通过串口与PC通信,把采集的数据串行传送到PC机上,再在PC机上进行数据处理。 PC机配置的都是RS-232标准串口,为D型…

1.15io网络

子网掩码 1.由于对于一个网络下面的主机号还是很庞大,为了进一步划分网络,我们可以将主机号再次进行划分为两部分,分别是网段号和主机号 2.此时就引入的子网掩码的概念 3. 在引入子网掩码后,IP 网络号 子网号 主机号 4.子网…

DataX数据同步(全量)

1. DataX简介 1.1 DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址:https://github.com/alibaba/Dat…

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

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

【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

文章目录 一. “解耦”概述二. 如何给代码“解耦”?1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用,能够让开发和重构同步进行,不互相干扰。 3. 模块化4. 其他设计思想和原则4.…

[我的Rust库更新]get_local_info 0.2.3

今天收到西安城市开发者社区的文章收录通知,谢谢社区的肯定。 随即发布0.2.3版本,增加峰值算法。 get_local_info是一个获取linux本地信息的Rust三方库,其目标是降低获取本地linux系统信息的难度。支持银河麒麟10、UOS、鸿蒙等国产系统。 项…

力扣hot100 只出现一次的数字 位运算

Problem: 136. 只出现一次的数字 文章目录 思路复杂度Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public int singleNumber(int[] nums) {int res 0;for(int x : nums)res ^ x;return res;} }

C#编程-使用反射检索元数据

使用反射检索元数据 术语反射通常用来指镜像。如果您站在镜子面前,镜子会反射出您的所有物理属性,如:您的身高、肤色和身体结构。在C#中也一样,反射被用于反射程序有关的所有信息。C#程序可以利用反射获得类在运行时的信息。 反射在运行时获取类型信息的过程中被使用。提…

C技能树-学习笔记(1-2)C语言概述和数据类型

参考:https://edu.csdn.net/skill/c 1、输出 “Hello, World!” 字符串,请选出错误答案。 2、错误的print函数。 for … in …:是python的语法,C语言的写法是for (;😉 3、C标准 没有C19标准。 4、了解C编译管道 …

实战whisper:本地化部署通用语音识别模型

前言 Whisper 是一种通用语音识别模型。它是在大量不同音频数据集上进行训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。 这里呢,我将给出我的一些代码,来帮助你尽快实现【语音转文字】的服务部署。 以下…

3.3.3 使用集线器的星形拓扑

3.3.3 使用集线器的星形拓扑 集线器的一些特点 3.3.4 以太网的信道利用率 多个站在以太网上同时工作就可能会发生碰撞当发生碰撞时,信道资源实际上是被浪费了。因此,当扣除碰撞所造成的信道损失后,以太网总的信道利用率并不能达到100% 3.…

星图地球——Landsat5_C2_SR_T1数据集

数据简介: Landsat5_C2_SR数据集是经大气校正后的地表反射率数据,属于Collection2的二级数据产品,空间分辨率为30米,基于Landsat生态系统扰动自适应处理系统(LEDAPS)(版本3.4.0)生成。水汽、臭氧、大气高度、气溶胶光学厚度、数字…

github访问不了解决方法

github突然无法访问,解决办法如下: 1、首先通过网址GitHub.com - GitHub: Lets build from here GitHub查看当前github.com对应的IP地址,查到的信息如下图所示 2、修改hosts文件,windows系统下修改 C:\Windows\System32\driver…

关于前端面试中forEach方法的灵魂7问?

目录 前言 一、forEach方法支持处理异步函数吗? 二、forEach方法在循环过程中能中断吗? 三、forEach 在删除自己的元素后能重置索引吗? 四、forEach 的性能相比for循环哪个好? 五、使用 forEach 会不会改变原来的数组&#…

步进电机基本原理详解

步进电机基本原理 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。 区别于以电压或电流作为控制信号,被控制量是转速的电动机。 每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正…