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

TCP之深入浅出send&recv

接触过网络开发的人,大抵都知道,上层应用使用send函数发送数据,使用recv来接收数据,而send和recv的实现原理又是怎样的呢? 在前面的几篇文章中,我们有提过,TCP是个可靠的、全双工协议。...在本文中,我们首先会简单介绍下TCP中发送缓冲区和接收缓冲区的作用(对于后面理解send和recv非常重要),然后讲解Linux系统下,TCP发送和接收数据是如何实现的。...在Linux内核中,有两种方式可以查看tcp缓冲区buffer大小。...),如果应用程序不理会,立即再次调用send,那么会得到-1的值, 在linux下表现为errno=EAGAIN. 3.接收应用程序在处理完1k数据后,关闭了socket: 接收主机作为主动关闭者,...https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/ipv4/tcp.c#n1581 END 高性能架构探索

4.6K72

TCP发送缓存阻塞(Send-Q不为0)问题

users:((“ceph-osd”,pid=40468,fd=597)),rtt:2.232/4.311,lastsnd:2659,lastrcv:883587,lastack:2659 可以观察到发送端send-Q...不减少,甚至是继续增大,send-Q在建立链接之后表示的含义是当前滑动窗口里sendbuffer里的字节数,sendbuffer只有在接收到对端的ack之后才会清理掉,所以可以断定发送端是没有接收到对端的回复的...常见的TCP发送端send-Q不减少都是因为接收端接收缓存满了给发送端回复win=0的反压报文,发送端不再给接收端发送报文导致send-Q不减少,但是通过接收端的tcpinfo信息来看,接收端的接收缓存为空...,这其实是一个问题,不管TCP大小修改为多小,最多就是消息发送缓慢,而不是卡住不发送,改小了发送缓存后,抓包分析。...结论: 疯狂google后发现有人遇到了类似的问题,原来是tcp的bug, 内核修复了后该问题不再出现。

6.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux网络编程TCP

    TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。...OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...error\n"); return 0; } printf("Send success...

    5.4K30

    Linux TCP RST情况

    其中复位标志RST的作用就是“复位相应的TCP连接”。 TCP连接和释放时还有许多细节,比如半连接状态、半关闭状态等。详情请参考这方面的巨著《TCP/IP详解》和《UNIX网络编程》。...原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。...; 客户端和服务器统一使用TCP短连接。...,固定5分钟tcp连接回收,而且发现连接出错时,重发之前10s内消息。...SO_LINGER 应用强制使用rst 关闭 该选项会直接丢弃未发送完毕的send buffer,可能造成业务错误,慎用; 当然内网服务间http client 在收到应该时主动关闭,使用改选项,会节省资源

    5.9K10

    Linux网络】TCP协议

    引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转移、TCP数据流、TCP数据流的控制等等方面来讨论! 在TCP协议中,通信双方的地位是平等的。...1、TCP协议的特点 传输层中我们常用的协议有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:面向连接、可靠的、面向字节流的。...当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或者多个TCP报文发出去,因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数没有固定的数量关系。...当接收缓冲区收到一个或者多个TCP报文后,TCP模块将它们携带的应用程序的数据按照TCP报文的序号【见下文】依次放入TCP接收缓冲区中,并通知应用程序读取数据。...Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时 时间都是500ms的整数倍.

    9610

    recv&send函数

    一、recv函数 int recv( SOCKET s, char *buf, int len, int flags); 函数功能:不论客户端还是服务端都能通过recv从TCP另一端接收数据。...二、send函数 int send( SOCKET s,char *buf,int len,int flags ); 功能:不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。...客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。...三、运行过程 同步Socket的send函数的执行流程,当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度(因为待发送数据是要copy到套接字s的发送缓冲区的,注意并不是send...3.如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send

    1.2K20

    FreeSwitch:send_dtmfuuid_send_dtmf发送按键注意事项

    在一些特定流程中,系统自动发起呼叫打到前台,希望实现自动按键(即:不用人手动按键),FreeSwitch提供了2个基本命令: send_dtmf及uuid_send_dtmf ,这2个基本功能一样,send_dtmf...常用于ESL Outbound外联模式,不需要指定uuid,而uuid_send_dtmf则需要指定uuid....以uuid_send_dtmf为例,演示下基本用法:(FreeSwitch控制台模式下) 1、先发起一个呼叫 1 freeswitch@xxx> create_uuid 2 4841d610-fba3-...继续折腾,uuid_send_dtmf 命令在按键后,还可以附加一个可选参数 tone_duration, 可以试下效果: uuid_send_dtmf 4841d610-fba3-46b3-9432...最后1个细节,实际使用中可能会遇到对方收的按键丢失,通常是发送太快,特别是号码中间有连续数字时,比如: 700001,发过去后,对方可能收到的是70001(少1个0) uuid_send_dtmf Send

    1.4K20

    send,recv,sendto,recvfrom

    server应用程序都用send函数来向TCP连接的还有一端发送数据。...客户程序一般用send函数向server发送请求,而server则通经常使用send函数来向客户程序发送应答。...假设send函数copy数据成功,就返回实际copy的字节数,假设send在copy数据时出现错误,那么send就返回SOCKET_ERROR;假设send在等待协议传送数据时网络断开的话,那么send...recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags ); 不论是客户还是server应用程序都用recv函数从TCP...sendto和recvfrom一般用于UDP协议中,可是假设在TCP中connect函数调用后也能够用. sendto()和recvfrom()——利用数据报方式进行传输数据   在无连接的数据报socket

    1.5K10

    Linux下Socket网络编程send和recv使用注意事项

    1.send函数 ssize_t send( SOCKET s, const char *buf, size_t len, int flags ); (1)send先比较待发送数据的长度len和套接字s...,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len; (3)如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完...; (4)如果len小于剩余空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传送的,send仅仅是把buf中的数据copy...注意: (1)如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回-1;如果send在等待协议传送数据时网络断开的话,那么send函数也返回...Q&A: (1)两次send一次recv会发生什么? 一次性读取两次send的内容。 (2)recv之后,接收缓冲区会被清空吗? 是的。

    3K31

    koa-send源码分析

    koa static是一个koa中间件,内部是对koa send的封装。koa static本身只做了一层简单的逻辑,所以这篇文章主要分析一下koa send的实现方式。...koa send的实现也大概是这个思路,另外多了一些基于http协议的处理,当然,阅读koa send的源码,还是有一些意外的收获。...koa send源码很简洁,唯一暴露了一个工具函数sendsend函数大致结构如下: async function send(ctx, path, opts = {}) { // 1、参数path...2、配置opts初始化 // 3、accept encoding处理 // 4、404、500处理 // 5、缓存头处理 // 6、流响应 } 第1步和第2步是koa send...第3步,主要是根据请求头进行处理,如果用户浏览器支持br或者gzip的压缩方式,koa send会判断是否存在br或者gz格式文件,如果存在会优先响应br或者gz文件。

    74820
    领券