首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Sweet Snippet系列 之 TCP数据接收

Sweet Snippet系列 之 TCP数据接收 一.引子   虽说仍然是Sweet Snippet,不过本篇并没有代码,纯粹是自己觉得有点趣味,就索性一记了~ 二. ...问题   接触过网络编程的朋友大概都应知道TCP,作为一种“流”式协议,TCP的粘包问题一直都是程序处理的要点,而这次的问题就是,如果发送n字节的TCP数据,对端接收时会出现多少种接收情况? 三. ...解法   我们先从具体的一个实例来简单算一算吧~就假设我们发送了3个字节的TCP数据: image.png   由于TCP如果接收成功至少可以接收一个字节,所以对于3个字节的数据而言,最多可能造成总计三次...TCP接收,让我们分情况讨论一下:   对于只发生一次TCP接收就获取全部数据的情况,只有1种可能(分隔线代表一次接收): image.png 对于发生两次TCP接收,有2种可能: image.png...  对于发生三次TCP接收,显而易见,只有1种可能: image.png 所以总的接收情况次数为:C(3) = 1 + 2 + 1 = 4 对于n个字节的一般情况,分情况讨论的方法就有些费心费力了

55010

TCP协议发送接收数据简单实现

背景 Demo 基于 Java 实现简单的 TCP 传输 / 接收协议 词义百科 TCP 协议 (传输控制协议) TCP 协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,再传输数据...在 TCP 连接中必须要明确客户端与服务器,由客户端向服务器发送连接请求,每次连接的创建都需要经过 “三次握手” 三次握手:TCP 协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠...TCP 协议可以保证传输数据的安全,所以应用十分广泛,比如:文件上传、文件下载、浏览页面 三次握手示意图 四次挥手示意图 发送端 Demo package tcp; import java.io....*; import java.net.InetAddress; import java.net.Socket; /** * TCP 发送数据步骤 * 1.创建客户端socket对象 * 2.获取输出流...接收数据步骤 * 1.创建服务端socket对象 * 2.监听客户端连接,返回一个socket对象 * 3.获取输入流,读数据,并把数据显示在控制台 * 4.释放资源 */ public class

1.2K50
您找到你想要的搜索结果了吗?
是的
没有找到

TCP接收窗口的实现(一)

TCP首部中的Window字段,表示当前套接字的接收窗口,即目前可以接收数据大小,对端不会发送超过接收窗口大小的数据。...如果在三次握手时,两端都支持Windows Scale选项,则实际的接收窗口还要乘以Windows Scale的值。 这个主题将分为两部分:本文是第一部分,是TCP的初始接收窗口大小是如何决定的。...第二部分,分析TCP的动态接收窗口。 主动连接 TCP主动发起连接,即发送三次握手中的第一个SYN报文。这时,TCP窗口的大小自然取决于本地的参数。...32 对于TCP协议来说,重要的是要保证MSS是有效的。当用户配置的MSS值大于出口的MSS时,为了保证TCP数据报文的正常通信,则选择较小的值。...而一般来说,大家都很少设置window上限,所以TCP初始接收窗口的大小就决定于套接字的缓存和拥塞窗口(这个由系统决定)。 ---- 居安思危,手不释卷。

2.7K41

MULE 无法接收TCP报文问题分析

你认为所有人都绝不可能犯的简单错误 问题梳理¶ 再次回顾一下开发的详细描述, 事实有: 专线接入 TCP协议传输 请求经常性的出现超时 渠道方反馈一直超时read timed out 服务器是正常接收渠道方请求...APM监控, 我这边有2套: 开源APM - pinpoint 商业APM - Dynatrace AppMon 先装pinpoint, 装完pinpoint agent重启后, 发现拿不到请求数据....拿不到数据2个原因: mule 这个组件比较特殊, 没有对应的插件; 报文直接走的4层TCP协议, pinpoint无法抓到4层TCP. 所以最后还是安装Dynatrace了监控....一直在socketRead读取数据. (也是通过监控看到的) 所以,之前的事实: 换另一个mule(6040) app, 应用可以立马收到 并不是事实. 2. 肯定不是网络和主机的问题....问题根因详细说明¶ 开发老师的根因详细说明: 问题定位到了,mule的一个getway方法对渠道请求做TCP解析后再把消息转给mule-forN公司 8110端口,现在是接收到渠道416个字符,但是重新

1.4K30

Go:使用TCP发送和接收大文件

在Go中进行TCP编程时,文件的发送和接收是一个常见的问题,特别是处理大文件时。本文将深入探讨如何在Go中使用TCP发送和接收大文件,以及如何有效地处理这类问题。...文件的发送和接收:基础 文件的发送和接收基本上就是读取和写入数据的过程。在Go中,我们可以使用io包中的io.Reader和io.Writer接口来读取和写入数据。...io.Copy函数会从源(在这里是文件)读取数据,并将数据写入到目标(在这里是TCP连接)。...然后,服务器根据这个文件头来接收文件数据。...需要注意的是,如果发送和接收方的机器使用不同的字节序,那么发送方在发送数据时需要将数据转换为网络字节序,接收方在接收数据时需要将数据从网络字节序转换为本地字节序。

80510

Windows TCP: TCP接收窗口自动调谐(Auto-Tuning)原理介绍

在本文我将介绍TCP接收窗口及其对TCP吞吐量的影响、TCP窗口扩展的使用以及Windows Vista和Windows Server 2008中新的接收窗口自动调整功能,这些功能可优化接收数据TCP...类似地,在使用TCP连接终止过程协商之后,TCP连接被正式关闭。 第三,对TCP连接上发送的可靠数据进行排序,并且期望从接收端得到肯定的确认。如果没有接收到肯定确认,则重发该段。...为了限制发送端任何一次可以发送的数据量,并为接收端提供流量控制,TCP对等体使用一个窗口,这个窗口是接收端允许发送端发送的字节流上的数据跨度。发送方只能发送位于窗口内的字节流的字节。...[匹配发送和接收窗口.gif] 为了指示接收窗口的大小,TCP报头包含16位窗口字段。当接收方获得数据时,它将向发送方发送回指示成功接收字节的ACKs。...因为接收窗口中可能有应用程序尚未检索到的数据和已接收但未确认的数据,所以TCP接收窗口具有额外的结构,如图2所示。 [TCP接收窗口中的数据类型.gif] 请注意最大和当前接收窗口之间的差异。

3.8K60

高性能网络编程3—-TCP消息的接收

这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。...本文将通过三幅图讲述三种典型的接收TCP消息场景,理清内核为实现TCP消息的接收所实现的4个队列容器。...接收TCP消息的过程可以一分为二:首先是PC上的网卡接收到网线传来的报文,通过软中断内核拿到并且解析其为TCP报文,然后TCP模块决定如何处理这个TCP报文。...sysctl_tcp_low_latency && tp->ucopy.task) {           //到这里,通常是用户进程读数据时没读到指定大小的数据,休眠了。...10、此时,由于S2是连接上正要接收的序号,同时,有一个用户进程正在休眠等待接收数据中,且它要等待的数据起始序号正是S2,于是,这种种条件下,使得这一步同时也是网络软中断执行上下文中,把S2-S3报文直接拷贝进用户内存

1.2K51

tcp socket的发送与接收缓冲区

1) 应用程序可通过调用send(write, sendmsg等)利用tcp socket向网络发送应用数据,而tcp/ip协议栈再通过网络设备接口把已经组织成struct sk_buff的应用数据(tcp...数据报)真正发送到网络上,由于应用程序调用send的速度跟网络介质发送数据的速度存在差异,所以,一部分应用数据被组织成tcp数据报之后,会缓存在tcp socket的发送缓存队列中,等待网络空闲时再发送出去...同时,tcp协议要求对端在收到tcp数据报后,要对其序号进行ACK,只有当收到一个tcp 数据报的ACK之后,才可以把这个tcp数据报(以一个struct sk_buff的形式存在)从socket的发送缓冲队列中清除...struct sock的成员sk_rcvbuf表示接收缓冲队列的大小,其初始值取mysysctl_tcp_rmem[1],成员sk_receive_queue 是接收缓冲队列,结构跟sk_write_queue...tcp socket的发送缓冲队列跟接收缓冲队列的大小既可以通过/proc文件系统进行修改,也可以通过TCP选项操作进行修改。

3.3K20

搞了半天,终于弄懂了TCP Socket数据接收和发送,太难~

内核管理的每一个TCP文件描述符都是一个struct, 它记录TCP相关的信息(如序列号、当前窗口大小等等),以及一个接收缓冲区(receive buffer,或者叫receive queue)和一个写缓冲区...假设数据包是按顺序的到来的,那么数据有效负载就被复制到套接字的接收缓冲区中。...例如,内核可能会将每个接收和写入队列的大小限制在100KB。然后每个TCP套接字可以使用的最大内核内存量大约为200KB(因为与队列的大小相比,其他TCP数据结构的大小可以忽略不计)。...读语义 如果接收缓冲区为空,并且用户调用read(2),则系统调用将被阻塞,直到数据可用。 如果接收缓冲区是非空的,并且用户调用read(2),系统调用将立即返回这些可用的数据。...如果接收缓冲区已满,而TCP连接的另一端尝试发送更多的数据,内核将拒绝对数据包进行ACK。这只是常规的TCP拥塞控制。 写语义 如果写入队列未满,并且用户调用写入,则系统调用将成功。

7.4K41

2.2接收数据

数据接收服务器的作用 数据接收服务器就跟它的字面意思一样,负责接收从设备发送来的数据。它在设备和系统之间起着桥梁作用。有很多种方法可以从设备把数据发送给服务器,其中具有代表性的包括以下两种方法。...使用一般的 Web 框架就可以制作数据接收服务器。设备用 HTTP 的 GET 方法和 POST 方法访问服务器,把数据存入请求参数和 BODY 并发送(图 2.6)。...QoS 0 指的是最多发送一次消息( at most once)(图 2.11),发送要遵循 TCP/IP 通信的“尽力服务” A。消息分两种情况,即到达了一次中介处,或没有到达中介处。...数据格式 前面我们围绕用于接收数据的通信过程,即协议进行了讲解。事实上,数据就是通过协议来进行交换的。当然,就如我们前文所说,这条规则在物联网的世界里也是不变的。...如果能直接以二进制形式接收数据,是不是就能更迅速地处理数据了呢?由此,一种数据格式应运而生,它就是 MessagePack(图 2.19)。

2.2K30

高性能网络编程3----TCP消息的接收

这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。...本文将通过三幅图讲述三种典型的接收TCP消息场景,理清内核为实现TCP消息的接收所实现的4个队列容器。...接收TCP消息的过程可以一分为二:首先是PC上的网卡接收到网线传来的报文,通过软中断内核拿到并且解析其为TCP报文,然后TCP模块决定如何处理这个TCP报文。...sysctl_tcp_low_latency && tp->ucopy.task) {   //到这里,通常是用户进程读数据时没读到指定大小的数据,休眠了。...10、此时,由于S2是连接上正要接收的序号,同时,有一个用户进程正在休眠等待接收数据中,且它要等待的数据起始序号正是S2,于是,这种种条件下,使得这一步同时也是网络软中断执行上下文中,把S2-S3报文直接拷贝进用户内存

1K10

jrtplib接收rtcp_qt tcpsocket 接收数据

前言 JRTPLIB 是 C++ 语言编写的 RTP 库,它帮助我们封装了 RTP 协议细节,用户通过提供好的接口可以设置 RTP 包信息并发送到指定地址,也可以接收 RTP 包取出信息...本文仅介绍如何使用 JRTPLIB 发送/接收 RTP 数据包,我在这篇博客又介绍了如何使用 JRTPLIB 构造 RTP 数据包来荷载 H264 码流数据。 二....JRTPLIB接收RTP包程序 #include #include #include <jrtplib3...RTPTime::Wait(delay); } sess.EndDataAccess(); return 0; } 编译后运行如上,设置本地监听端口后就会开始等待 RTP 数据...RTPTime(10, 0), 0, 0); return 0; } 编译后运行如上,输入本地 UDP 使用的端口以及对端监听的端口,设置需要发送的 RTP 包数即可发送,发送后接收端打印的信息如下

2.2K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券