Socket的Send和Recv接收速率慢说明

1. 背景

在不同电脑的Windows系统中,使用同一个服务程序和客户端程序(TCP协议)进行测试,在部分电脑(win7)出现Send 和Recv大量数据,有时会出现Send和Recv一个数据包耗时1~2s的情况。

2. 原因

最终发现是不同的电脑带宽不一样,导致Recv的速率不一样,而对于TCP协议,若内核中的Socket Recv缓冲区满,而数据没有及时被应用读取走,此时服务程序Send一个数据包的耗时就会加长(因为一直在重发数据包)。这种问题可以通过尝试修改内核中的Socket Recv缓冲区大小来解决该问题,默认Send和Recv缓冲区大小为8K。

3.SO_SNDBUF & SO_RCVBUF

2.1基本说明

SO_SNDBUF
Sets send buffer size. This option takes an int value. (it is 8K by default).
SO_RCVBUF
Sets receive buffer size. This option takes an int value.

每个套接口都有一个发送缓冲区和一个接收缓冲区,使用SO_SNDBUF & SO_RCVBUF可以改变缺省缓冲区大小。

对于客户端,SO_RCVBUF选项须在connect之前设置.
对于服务器,SO_RCVBUF选项须在listen前设置.

2.2 使用setsockopt或getsockopt进行缓冲区大小设置或大小获取

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TCP(Transmission Control Protocol)是一种面向连接的可靠传输协议,用于在网络中传输数据。它提供了可靠的、有序的、字节流形式的数据传输。 TCP通信的原理如下: 1. 建立连接:通信的两端(客户端和服务器)通过三次握手建立连接。客户端发送一个带有 SYN(同步)标志的请求,服务器收到后回复一个带有 SYN/ACK(同步/确认)标志的响应,最后客户端再发送一个带有 ACK(确认)标志的确认。这样就建立了双方的连接。 2. 数据传输:连接建立后,双方可以开始传输数据。数据被划分为多个数据包,每个数据包都有一个序号。发送方将数据包发送给接收方,并等待接收方发送确认消息。如果发送方没有收到确认消息,它会重新发送数据包。 3. 确认机制:接收方收到数据包后,会发送确认消息给发送方,表明已经成功接收数据。如果发送方没有收到确认消息,它会认定数据包丢失,并重新发送。 4. 拥塞控制:TCP使用拥塞控制机制来防止网络拥塞。当网络负载过高时,TCP会减少发送速率,以保证网络的稳定性。 5. 连接释放:当通信结束时,双方可以通过四次握手来释放连接。其中一方发送一个带有 FIN(结束)标志的请求,另一方回复一个带有 ACK 标志的确认,然后再发送一个带有 FIN 标志的请求,最后对方再回复一个 ACK 标志的确认。这样连接就被释放了。 TCP通信的实现方法: 在编程中,可以使用套接字(socket)来实现TCP通信。套接字是一种通信端点,通过套接字可以进行数据的发送和接收。在客户端和服务器端分别创建套接字,并使用相应的API函数进行连接、发送数据和接收数据。 在客户端: 1. 创建套接字:使用socket()函数创建一个套接字。 2. 建立连接:使用connect()函数与服务器建立连接。 3. 发送数据:使用send()函数发送数据给服务器。 4. 接收数据:使用recv()函数接收服务器返回的数据。 5. 关闭连接:使用close()函数关闭套接字。 在服务器端: 1. 创建套接字:使用socket()函数创建一个套接字。 2. 绑定地址:使用bind()函数将套接字与服务器地址绑定。 3. 监听连接:使用listen()函数监听客户端的连接请求。 4. 接受连接:使用accept()函数接受客户端的连接请求,并返回一个新的套接字用于与客户端通信。 5. 接收数据:使用recv()函数接收客户端发送的数据。 6. 发送数据:使用send()函数向客户端发送数据。 7. 关闭连接:使用close()函数关闭套接字。 以上是TCP通信的基本原理和实现方法。通过这种方式,客户端和服务器可以进行可靠的数据传输和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值