TCP与UDP

2023-11-04

前言

TCP和UDP是两个传输层最有代表性的传输层协议,TCP一般提供可靠的信息传输,而UDP常被用于广播和细节控制交给应用的通信传输

传输层的定义

在传输层,IP首部有一个协议字段,用来区分使用的是什么协议,用端口号进行处理的具体程序
在TCP,UDP协议中,就是靠端口号来进行通信处理的

tcp

TCP是面向有连接的,同时是一直访问的
TCP保障了稳定性

DUP

UDP是不具有可靠性的数据协议
UDP保证了实时性

端口号

定义:端口号是用来识别同一计算机中通信的不同程序,因此也被称为程序地址
传输层协议正是利用这些端口号识别本机中正在进行通信的程序
TCP通过源IP地址,目标IP地址,协议号,源端口号,目标端口号来确定一个通信,一旦有一个不同,就会被认为为其他的通信

端口号如何确定

静态方法:很多应用程序都有它固定的端口号,如HTTP,FTP
时序分配法:动态的由操作系统来分配

不同的协议可以使用相同的端口号

TCP

TCP人如其名,代表着传输,发送,通信,进行控制的协议
TCP可以进行丢包时候的重发控制,还可以进行次序乱掉的分包进行顺序控制,同样的,TCP在确定对方存在的情况下才会发送信息,这节约了流量
在TCP中,回复就相当于ACK(确定收到的信号)
但是有时候ACK在回复的时候会丢失,这时也会重发,这对目标主机就是灾难
以下就是这些的解决方法


序列号:序列号是按顺序给发送数据的每一个字节都标上号码的编号,接收端将下一步要接收的序列号返回回去
重发超时:就是等待确定应答到来的那个特定的时间间隔,如果超过这个时间就会进行重发,但是达到一定的重发次数之后,就会判断产生了错误,就会强行断开连接
三次握手
TCP的三次握手过程如下:

1)首先客户端发送seq=c的SYN数据包

服务器端响应一个seq=s,ack=c+1的SYN+ACK数据包

最后客户端回复一个seq=c+1,ack=s+1的ACK数据包,三次握手完成

MSS

定义:最大消息长度,最大消息长度正好是IP中不会被分片处理的最大数据长度;在建立连接的时候,这个就会写在首部

窗口

定义:是无需等待确定应带可以继续发送数据的最大值
滑动窗口控制,就是不是每一个数据都要重发,而是不发收到应答的,而去发后面的,给人滑动的感觉

窗口重发机制

两种情况:
未能收到答复:如果收到后面的答复,就会继续进行
传送丢失:设置接收端没有收到自己需要的序列号的时候,就会重发之前收到的确定应答,所以当发送端收到三次相同的确定答复就会进行重发

流控制

就是控制流量的多少,在少的时候变大,在多的时候变少

拥塞控制

控制传输的流量,使不会过多,也不会过少,不会导致网络瘫痪

提高网络利用率的规范

Nagle算法:该算法是指发送即使还有应该发送的数据,但是部分很少的话,会延迟发送的一种算法

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

TCP与UDP 的相关文章

  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 如何在java应用程序中检测FIN - tcp标志?

    我在两台计算机之间有持久的 TCP 连接 第二台计算机不受我的控制 第二台计算机可以随时发送FIN标志 并且首先必须关闭当前连接 将FIN标志发送回第二台计算机 我如何知道第二台计算机正在发送 FIN 标志 以及何时必须调用 Java 应用
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • Rails 是否支持侦听 UDP 套接字的简洁方式?

    在 Rails 中 集成更新模型某些元素的 UDP 侦听过程的最佳方式是什么 特别是向其中一个表添加行 简单的答案似乎是在同一进程中使用 UDP 套接字对象启动一个线程 但不清楚我应该在哪里执行适合 Rails 方式的操作 有没有一种巧妙的
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • 发起TCP连接关闭后如何接收数据?

    TCP 允许一侧发出 FIN 并让另一侧在结束其一侧的连接之前响应一些数据 我如何使用 NET 来实现这一点TcpClient 看来我必须使用Close发出FIN 但之后我不能再打电话Client Receive since Client被
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用
  • 自动打开命名管道和 tcp\ip

    我正在安装一个需要修改 SQL Server 的新产品 具体来说 启用 tcp ip 并打开命名管道 我知道如何手动完成 我想要的是一种通过 SQL 或 C 代码为新客户自动化执行此操作的方法 我希望有任何关于正确方向的建议 您可以使用 C
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 建立 TCP 连接边界的正确方法

    我的问题是关于如何正确处理使用 tcp 连接接收的数据 事实上 通过建立 tcp 连接 创建了一个流 假设我想发送一条有开头和结尾的消息 由于数据在流中流动而没有指定任何边界 我如何识别消息的开始和结束 我想在消息的开头和结尾处放置一些特殊
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • Node.js 可读流_read用法

    我了解如何在 Node 的 new 中使用可写流Streams2库 但我不明白如何使用可读流 举个例子 一个流包装器围绕dgram module var dgram require dgram var thumbs twiddle func
  • 尝试接收 UDP 多播时出现空指针异常

    在尝试了几次让简单的 UDP 多播接收器工作后 我感到很困惑 在我自己的代码无法按预期工作后 我尝试了 vertx 文档中发布的确切示例 DatagramSocket socket vertx createDatagramSocket ne
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速

随机推荐

  • ananconda添加镜像

    先执行 conda config set show channel urls yes 生成该文件之后再修改 在用户目录下的 修改 condarc 文件 channels defaults show channel urls true cha
  • 联想小新air14安装ubuntu16.04

    首先正常安装 会遇到显卡问题 进入ubuntu高级模式 recovery mode resume 然后按照这篇教程整 https blog csdn net Guangli R article details 86636923 utm so
  • PCB设计 接地 铺铜的技巧

    PCB设计 接地 铺铜的技巧 1 PCB设计接地敷铜的技巧 pcb 电工之家 2 覆铜步骤及设计规则 百度文库 3 产品可靠性1 多层电路板应不应该在顶层和底层铺铜 Steven Aileen的博客 CSDN博客 4层板顶底层还用铺铜吗
  • 淘宝、支付宝菜鸟小程序取件码找不到的解决方法

    淘宝 支付宝菜鸟小程序身份码找不到的解决方法 今天拿快递的时候在淘宝里面找身份码 死活找不到 明明之前可以找到的 最后还是下载了菜鸟裹裹app才能取件 上网搜索了一下 发现有的地方很早就把小程序里面的身份码给阉割了 强行让用户下载app实属
  • Evaluate Video Quality

    How to evaluate video PSNR and SSIM PSNR is easy to calculate http blog csdn net c602273091 article details 49861817 SSI
  • 跟着angularjs2官方文档学习(五)

  • 走进 San CLI(下):实现原理

    作者 胡粤 上期我们讨论了 San CLI 的使用 这期我们再深入一点 来看看 San CLI 的实现原理 核心模块和核心概念 为了方便理解下文的 San CLI 的整体工作流程 主流程 我们先来看下 San CLI 的核心模块和核心概念
  • 调试osgEarth(三十四)资源释放器子节点的作用

    感谢 hankern 学习链接https blog csdn net hankern article details 85519058 继续调试 设个断点 开始时没有要释放的资源 看上一层 再上一层 很明显 ResourceReleaser
  • beego禁用3DES和DES弱加密算法--SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】(二)

    目录 程序代码 nmap重新扫描 程序代码 用beego起的一个 https 服务 被扫描出了漏洞 SSL TLS协议信息泄露漏洞 CVE 2016 2183 需要禁用DES加密算法 参考源码 解决方法如下 beego Run 前添加 ci
  • linux基础--基础

    Linux结构目录 Linux 部分目录结构 根目录 只存放目录 不要存放文件 目录 如 etc bin dev lib sbin 等放置在一个分区中 bin 可执行二进制目录文件 如常用的ls cat mv tar 命令存放在本目录中 查
  • github上给自己的项目添加Collaborators

    一个软件项目不可避免的需要与别人合作 如果我们想要参与github上的开源项目 一般的方式是先fork 之后再pull request 但是这种方式如果是自己和别人一起开发的项目就很麻烦 这时我们可以给自己的项目添加Collaborator
  • Logstash安装logstash-integration-jdbc

    Logstash安装logstash integration jdbc 1 版本说明 logstash7 10 1 2 前置条件 logstash integration jdbc是使用ruby语言开发的 因此需安装gem gem是Ruby
  • 【Linux】用户组与文件目录权限

    Linux用户与组 Linux本身是个多用户多任务的操作系统 用户账户分类 root用户 UID 0 超级用户 能跨越一切用户和组群对所有文件或目录进行读取 修改 删除 系统用户 UID 1 999 虚拟用户 不具有登入Linux的能力 是
  • java中Graphics类的使用

    绘图 很多程序如各种小游戏都需要在窗口中绘制各种图形 除此之外 即使在开发JavaEE项目时 有 时候也必须 动态 地向客户 端生成各种图形 图表 比如 图形验证码 统计图等 这都需要利用AWT的绘图功能 组件绘图原理 之前我们已经学习过很
  • xtu oj 1328 数码和

    题目描述 一个10进制数n在2 16进制下可以得到的不同的数码和 求在这些数码和中出现次数最多的数码和 比如20 其中数码和2和4分别出现了3次 为最多出现次数 输入 第一行是一个整数T 1 T 1000 表示样例的个数 以后每行一个整数n
  • 企业研发提效抓手,揭秘云原生的效能“奇点”

    导语 在云原生时代 研发效能治理面临新的挑战 同时也获得了新的视角 如何更好地利用云原生技术的优势 从而在根本上提升研发效能 已成为许多企业数字化转型过程中的 必答题 今天 我们特别邀请了 Thoughtworks 创新技术总经理 腾讯云
  • linux kernel文件系统数据结构file_system_type

    linux kernel文件系统数据结构file system type 文件系统类型用于表示各种不同的文件系统 如fat sysfs proc等等 对于每个不同的文件系统 都以struct file system type进行描述 内核将
  • 202310读书笔记|《大白鲸原创图画书优秀作品:虾一跳》——蝴蝶效应之最,你值得一读

    202310读书笔记 大白鲸原创图画书优秀作品 虾一跳 蝴蝶效应之最 你值得一读 大白鲸原创图画书优秀作品 虾一跳 作者 耿彦红 文 齐海潮 图 由虾一跳的连锁反应构成了整本书的故事脉络 很生动 故事及叙述的重复都不冗杂 反而很朗朗上口 并
  • 密码学--CTF Crypto 总结

    密码学简介 密码学 Cryptography 一般可分为古典密码学和现代密码学 其中 古典密码学 作为一种实用性艺术存在 其编码和破译通常依赖于设计者和敌手的创造力与技巧 并没有对密码学原件进行清晰的定义 其主要包含以下几个方面 单表替换加
  • TCP与UDP

    前言 TCP和UDP是两个传输层最有代表性的传输层协议 TCP一般提供可靠的信息传输 而UDP常被用于广播和细节控制交给应用的通信传输 传输层的定义 在传输层 IP首部有一个协议字段 用来区分使用的是什么协议 用端口号进行处理的具体程序 在