TCP通信详解

2023-11-14

一、TCP简介

  1.TCP介绍

    a>TCP协议:TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为:TCP)是一种面向连接的、可靠的、基于字节流的通信协议

    1.面向连接:先连接,再通信,好比打电话模型

    2.可靠的,相对于UDP,TCP传输更可靠,TCP通过一序列的机制(面向连接机制、发送应答机制)来保障传输的可靠性

    3.基于字节流的,UDP创建UDP socket——DGRAM:基于数据报通信方式,每一次发送的数据都是一个独立的整体,包含目标主机的ip地址、端口号及发送数据的内容

    b>TCP通信的三个步骤

    基于面向连接的:1.与服务端建立连接

            2.收发数据

            3.关闭连接

  2.TCP特点

    a>面向连接

    1.先建立连接,再进行通信

    2.TCP连接是一对一的,而UDP可以一对一或一对多,UDP适合做广播程序

    a>可靠传输:通过一序列机制来保障TCP传输数据比UDP更可靠

    1.传送应答机制

    2.超时重传机制

    3.错误校验

    4.流量控制/阻塞管理

  3.TCP与UDP的不同点

    1.面向连接

    2.有序数据传输

    3.重发丢失的数据包

    4.丢弃重复的数据包

    5.无差错的数据传输

    6.阻塞/流量控制

  4.TCP与UDP的应用场景

    1.TCP的应用场景:适合通信质量要求较高的场景,http传输、文件传输、smtp等等,目前大部分的传输都是基于TCP协议传输

    2.UDP的应用场景:相对于TCP传输,UDP传输速度更快,实时性更好,耗资源更少,但稳定性、可靠性比TCP差,适合对网络通讯质量要求不高,速度要求尽量快,更实时,比如QQ语音,QQ视频

  5.UDP与TCP的通信模型

    a>UDP通信模型

      面向无连接,好比写信模型,没有严格的服务端与客户端之分

    b>TCP通信模型

      面向连接的,好比打电话模型,有严格的服务端与客户端之分

二、TCP网络程序-客户端(重点)

  1、TCP客户端实现流程

    1、创建一个TCP的socket对象

    2、与TCP服务端建立连接

    3、使用TCP socket 收发数据

    4、关闭连接

  参考代码如下:

          

                                    

三、TCP网络程序-服务端(重点)

  1.TCP服务端创建流程:

    1、创建服务端的server_socket,用于监听客户端的请求

    2、绑定端口

    3、server_socket开启监听,有主动连接改变为被动连接模式

    4、假如有客户端的请求,则立即接收,且创建一个与客户端对接的socket,与客户端进行通信

    5、使用新创建的socket与客户端通信

    6、关闭与客户端通信的socket,当该socket被关闭,则不再与当前客户端通信

    7、关闭用于监听客户端发送请求的socket,当该socket关闭,则不再接收新的客户端请求

  参考代码如下:

         

           

 

   2、同时为多个客户端提供服务:

        参考代码如下:

                              

                              

  4、为同一个客户端提供多次服务

    参考代码如下:

        

        

        

 

四、TCP注意点:

  

tcp服务端一般情况下都需要绑定,否则客户端找不到这个服务端
tcp客户端一般不绑定,因为是主动连接服务端,所以只要确定好服务端的ip、port等信息就好,本地客户端可以随机
tcp服务端中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务端时必须要做的
当客户端需要连接服务端时,就需要使用connect进行连接,udp是不需要连接的而是直接发送,但是tcp必须先连接,只有连接成功才能通信
当一个tcp客户端连接服务端时,服务端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
listen后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept返回的新套接字是标记这个新客户端的
关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够连接服务端,但是之前已经连接成功的客户端正常通信。
关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务端会recv解堵塞,并且返回的长度为0,因此服务端可以通过返回数据的长度来区别客户端是否已经下线


五、三次握手、四次挥手(了解)

a> 三次握手
第一次握手: 客户端A向服务端B发送连接请求(客户端-->服务端方向)
第二次握手: 服务端B向客户端A发送确认连接,同时向客户端A发送连接请求(服务端-->客户端方向)
第三次握手: 客户端A收到服务端的确认信息,正确无误后,再向客户端发送确认连接信息(客户端-->服务端方向)

b> 四次挥手

六、 服务器如何复用同一个端口而不会提示端口被占用
"""
socket.setsockopt(level,option,value) :配置socket
level:等级,对哪个等级操作(ip,tcp,udp,socket等级)
option:设置哪个选项
socket.SO_REUSEADDR: 复用地址
value: True:表示复用,False,表示不复用
"""
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 提示:socket.setsockopt()方法要在 socket.bind()之前设置

   

 七、案列:文件下载器

  a>客户端实现:

    “”“文件下载器客户端实现流程

       1、创建一个TCP socket

       2、连接服务端

       3、获取用户输入的文件名

          4、把要下载的文件名发给服务端

          5、等待接收服务端回传的文件内容

        6、假如内容不为空,则写入到文件中

        7、关闭TCP socket

    ”“”

    参考代码如下:

           

           

  b>服务端实现

    

""" 文件下载服务端实现流程
1. 创建服务端的socket,用来做监听的
2. 绑定端口
3. 开启监听 listen
4. 循环接收客户端的下载请求
5. 获取客户端发送过来的要下载的文件名
6. 通过函数取得要下载的文件的内容
7. 把内容回传给客户端
8. 关闭与客户端对接的socket
9. 关闭服务端server_socket,不再接收新的下载文件的请求
"""

参考代码如下:

      

      

      

 

    

 

 

 

 

 

转载于:https://www.cnblogs.com/python58/p/10426188.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP通信详解 的相关文章

  • 管理 Tweepy API 搜索

    如果这是对之前在其他地方回答过的问题的粗略重复 请原谅我 但我不知道如何使用 tweepy API 搜索功能 是否有任何有关如何使用搜索推文的文档api search 功能 有什么方法可以控制返回的推文数量 结果类型等功能 由于某种原因 结
  • 如何跳过财务图中的空日期(周末)

    ax plot date dates dates highs lows 我目前正在使用此命令来绘制财务高点和低点Matplotlib http en wikipedia org wiki Matplotlib 效果很好 但如何删除 x 轴上
  • SQLAlchemy:检查给定值是否在列表中

    问题 在 PostgreSQL 中 检查某个字段是否在给定列表中是使用IN操作员 SELECT FROM stars WHERE star type IN Nova Planet SQLAlchemy 的等价物是什么INSQL查询 我尝试过
  • 如何充分释放函数中使用的GPU内存

    我在用着cupy在接收一个函数numpy数组 将其推到 GPU 上 对其进行一些操作并返回cp asnumpy它的副本 问题 函数执行后内存没有被释放 如ndidia smi 我知道内存的缓存和重用cupy 但是 这似乎仅适用于每个用户 当
  • 为什么我不能“string”.print()?

    我的理解print 在 Python 和 Ruby 以及其他语言 中 它是字符串 或其他类型 上的方法 因为它的语法非常常用 打印 嗨 works 那么为什么不呢 hi print 在 Python 中或 hi print在红宝石工作 当你
  • 覆盖现有的 django-admin 命令

    除了编写自定义 django admin 命令之外 这是有详细记录的 https docs djangoproject com en 1 9 howto custom management commands 我希望能够覆盖现有命令 例如ma
  • 比较两个文本文件并计算差异

    我一直在尝试在Python中比较两个文本文件 本质上我想打开它们并一次比较一个字符 如果字符不同 则向计数器添加1 然后显示该值 这是我到目前为止所拥有的 usr bin env python diff 0 import random im
  • 使用 python-docx 在 docx 文件中查找所有“正常”样式且字体大小不是 11 的文本

    到目前为止我的实现 from docx api import Document import pandas as pd from docx shared import Pt texts sizes document Document new
  • Python代码执行时自动打开浏览器

    我正在 Python Flask 中实现 GUI Flask 的设计方式是 必须 手动 打开本地主机以及端口号 有没有一种方法可以使其自动化 以便在运行代码时自动打开浏览器 本地主机 我尝试使用 webbrowser 包 但它在会话终止后打
  • Microsoft Azure 数据仓库和 SqlAlchemy

    我正在尝试使用 python 的 sqlalchemy 库连接到 microsoft azure 数据仓库 并收到以下错误 pyodbc Error HY000 HY000 Microsoft ODBC SQL Server Driver
  • 将查询参数添加到 URL

    我正在尝试自动从网站下载数据 我需要将动态参数传递到每天更改的站点 html 的结构是表格而不是表单 如何传递参数并从 url 获取结果 这是我尝试过的 它需要在 python 2 7 中 import urllib url https d
  • 将 for 循环替换为 pyspark 中的并行进程

    我在脚本中使用 for 循环来为 size DF 数据帧 的每个元素调用函数 但这需要很多时间 我尝试通过地图删除 for 循环 但没有得到任何输出 size DF 是我从表中获取的大约 300 个元素的列表 用于 import call
  • 当我打印“查询”时获取 PY_VAR1

    我正在制作一个简单的网络抓取代码 当我尝试打印一个值时 它给了我其他东西 def PeopleSearch query SearchTerm query what is query print str query SearchTerm St
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道
  • 使用 plone.api 创建文件的 Python 脚本在设置文件时出现错误 WrongType

    Dears 我正在创建一个脚本python来在Plone站点中批量上传文件 安装是UnifiedInstaller Plone 4 3 10 该脚本读取了一个txt 并且该txt以分号分隔 在新创建的项目中设置文件时出现错误 下面是脚本 f
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • 无法在 Windows 服务器上使 SVN 预提交脚本失败

    我正在编写一个 SVN pre commit bat 文件 该文件调用 Python 脚本来查询我们的问题跟踪系统 以确定用户提供的问题跟踪 ID 是否处于正确的状态 例如 打开 状态 并与正确的关联项目 SVN 服务器运行 Windows
  • Java 相当于 Python 的 urllib.urlencode(基于 HashMap 的 UrlEncode)

    From https stackoverflow com questions 2018026 should i use urllib or urllib2 2018103 2018103 Java 中 Python 的 urllib url
  • 需要一个从 yaml 文件中提取内容并输出为 csv 文件的脚本

    我对 python 很陌生 但我很感激您帮助指导我创建一个简单的脚本 该脚本读取一堆 yaml 文件 同一目录中的大约 300 个文件 并从 yaml 文件并将其转换为 csv yaml 文件中内容的示例 code 9313 degrees
  • Python模糊字符串匹配作为相关样式表/矩阵

    我有一个文件 其中包含 x 个字符串名称及其关联的 ID 本质上是两列数据 我想要的是一个格式为 x by x 的相关样式表 将相关数据作为 x 轴和 y 轴 但我想要 fuzzywuzzy 库的函数 fuzz ratio x y 作为输出

随机推荐

  • C++网络编程Reactor模式介绍

    Reactor模式是一种事件驱动的设计模式 主要用于处理服务请求 这些请求在一开始并不知道何时会到达 它是一种非阻塞I O模式 可以处理大量并发连接 因此在网络编程中被广泛使用 Reactor模式的主要组件包括 Reactor 这是事件循环
  • 【TS第三讲】完善TS开发环境

    文章目录 写在前面 ts node nodemon nodemon文件类型 nodemon文件范围 写在最后 写在前面 探索TypeScript世界 驭Vue3 Ts潮流 开启前端之旅 欢迎来到前端技术的精彩世界 无论你是刚刚踏入编程大门的
  • JS加密方式

    常见加密方式 加密 前端 1 把加密的数据给后端 2 JS加密 3 携带正确的参数 进行加密 后端 存入数据库或者校验 为了反爬 前端请求就会进行携带指定的参数 参数的值会进行加密 后端再进行校验 1 MD5加密 概念 线型散列算法 签名算
  • ffmpeg结构体一览表

    AVFormatContext typedef struct AVFormatContext A class for logging and ref avoptions Set by avformat alloc context Expor
  • ESP32CAM基于Python环境开发实时摄影

    开发环境搭建 安装Thonny代码编辑器和ESP32带有CAM的固件 链接 https pan baidu com s 1NBTMvZzzF6eJse2Wsr2ykQ pwd 1o6y 提取码 1o6y 安装Thonny 教程网上一大把 基
  • 对称加密+非对称加密,实现数据安全传输

    一般金融类的产品 涉及前端和后端交互的时候 都会都严格的数据安全保证 防止黑客攻击 信息篡改 加密方式有很多 总的来说 分为2种 对称和非对称 我们先来看一下 这两种加密方式分别是什么 他们有什么区别 对称加密 对称加密 即采用对称的密码编
  • http和https协议

    HTTP协议 简介 HTTP是Hyper Text Transfer Protocol 超文本传输协议 的缩写 HTTP是一个属于应用层的面向对象的协议 由于其简捷 快速的方式 适用于分布式超媒体信息系统 HTTP协议以明文方式发送内容 不
  • 浮动元素无法撑开父元素问题

    如何解决浮动元素无法撑开父元素问题 首先我们看一下问题 div class wrapper div class content div div class content div div class content div div clas
  • 【Unity】新InputSystem中点按UI组件模拟键盘输入

    项目中用空格作为对话的交互键 想要实现对话时点按UI中的panel和空格有一样的效果 文档中创建event并传入的方法 原文地址 Input events Input System 1 3 0 第二个方法第二个参数搞不懂应该传入什么 第一个
  • 为你的VMware 15.5 虚拟机MacOS系统手动安装VMware Tools

    本博客同步发布在 为你的VMware 15 5 虚拟机MacOS系统手动安装VMware Tools VMware Tools 是VMware软件提供的一个辅助工具 可以提升虚拟机的使用体验 默认伴随虚拟机自动安装 但有时候自动安装会出错
  • 像数字化原生代那样思考——企业数字化转型的挑战与应对

    点击上方 中国云报 可关注 似乎是一眨眼间 90后 甚至 00后 已经成长起来 渐渐成了消费的主力军 他们使用的是各类移动智能设备 形形色色的社交工具 对云计算 大数据天生就具有亲近感 IDC有一个词来形容这一代消费者 数字化原生代 面对数
  • grafana创建dashboard

    前提 安装grafana 创建dashboard 点击侧边栏菜单Dashboards下的New dashboard 点击Add a new panel 进入到 New dashboard Edit 面板视图 到Query 标签页 配置你的Q
  • Android 隐藏虚拟按键,并且全屏

    隐藏虚拟按键 并且全屏 protected void hideBottomUIMenu 隐藏虚拟按键 并且全屏 if Build VERSION SDK INT gt 11 Build VERSION SDK INT lt 19 lower
  • 并发下sftp连接报错——com.jcraft.jsch.JSchException: connection is closed by foreign host

    当对单接口极限测试时 随着并发量上升 接口稳定性出现不稳定的情况 排查后台日志 发现报错在该接口调用sftp上传时出现问题 确切的是在初始化连接时失败 原因 系统SSH终端连接数配置过小 查看虚拟机该参数 该参数在 etc ssh sshd
  • 【操作系统】虚拟存储器概述

    存储管理分类 实存管理 分区 Partitioning 连续分配方式 包括固定分区 可变分区 分页 Paging 分段 Segmentation 段页式 Segmentation with paging 虚存管理 请求分页 Demand p
  • java 虚拟机类装载的原理、实现、以及应用

    一 引言 Java虚拟机 JVM 的类装载就是指 将包含在类文件中的字节码装载到JVM中 并使其成为JVM一部分的过程 JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块 而不影响系统其他功能模块的正常运行 本文将分析
  • python linux运行环境,Linux平台Python运行环境配置

    1 软件包管理工具 pip xiaokang localhost sudo yum install python2 pip 查看pip版本 xiaokang localhost pip V 大v pip 8 1 2 from usr lib
  • mysql8和5.7区别_MySQL8.0和MySQL 5的区别

    虽然MySQL8 0 x都出来了 自己一直使用 5 7的版本 对于新的版本今天抽了些时间来了解一下新的特性 而对于新的版本的了解往往都是从版本区别开始的 今天便算是作一个笔记吧 Oracle发布新版本的MySQL时 直接从5 7 x 跳到了
  • Redhat8.2 linux 忘记root密码破解方法 最详细!!!!!

    root密码破解方法 第一步 重启虚拟机 在开机标题界面 选择系统 按E进入 第二步 进入后在含LINUX开头结尾处加上 rd break 然后按CTRL X进入系统 第三步重新挂载根目录并给予读写权限 否则无法重置密码 第四步切换根目录位
  • TCP通信详解

    一 TCP简介 1 TCP介绍 a gt TCP协议 TCP协议 传输控制协议 英语 Transmission Control Protocol 缩写为 TCP 是一种面向连接的 可靠的 基于字节流的通信协议 1 面向连接 先连接 再通信