关于tcp 所携带的 最大数据的问题

BOYGUARD110 2004-11-26 12:07:42
////////////////////////////////////////////////
//
1. tcp 实验 (windows2000 vc++6.0 学校的局域网)

1) 最简单的tcp 连接框架 , 分为 server 端 和 client端
两端的socket对象的属性都采用 ::socket函数创建时候的默认值


2) 连接成功后,
client端 用 ::send 函数 发送 一次 数据
server端 用 ::recv 函数 接收 一次 数据

3) 改变 client 端 发送数据的大小,比如: 300 、1024、 60000 、200000 字节
然后重新编译连接, 观察 server端的接收情况


4) 我的实验结果:

client 发送600000 字节 , server 端收到 600000 字节

两端的数据 均使用 大数组存储,直到 数组大小到了上限,

数据的 发送 接收 都是正常的


5) 我的问题:

a. 1个 tcp 数据包 最大 能 携带 多少数据 ?

b. 在保证 server端能接收到的情况下,
::send 函数 1 次 最多 能发送 多少 数据 ?

c. 或者 “1个 tcp 数据包” 的说法是错误的,

因为 具体发送时 ,在网络上 传递的 基本单位是 一个 物理帧,

其它所谓的数据包 都是由 协议堆栈 来负责构造,

::send 函数 “看到的” 是1个 tcp 数据包 ,

1 个 tcp 数据包 可能被 分解成为 n 个 ip 数据包,

1 个 ip 数据包 可能被 分解成为 n 个 物理帧,

6) 请大家谈谈看法

并请指出我阐述中的错误之处, 谢谢
...全文
220 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BOYGUARD110 2004-11-29
  • 打赏
  • 举报
回复
up
HunterForPig 2004-11-27
  • 打赏
  • 举报
回复
这就要看
b.send()一次最多只能发送8K的数据;

如果超过8k,那就要分包处理,recv就要接受几次,再组包!
oyljerry 2004-11-26
  • 打赏
  • 举报
回复
tcp中后来引入了窗口扩大选项来增大窗口通知的大小
gdy119 2004-11-26
  • 打赏
  • 举报
回复
a.tcp,是流方式传输,只有一个TCP包最小限制为512BYTE;
b.send()一次最多只能发送8K的数据;
c.实际上可以称呼TCP包,即使是流方式传输,但网络状况等原因,不可能一次流
式发完,一个TCP包经过重组,全部到达网络堆栈,应用在接收
oyljerry 2004-11-26
  • 打赏
  • 举报
回复
tcp是流式数据的,它通过ip包来传递,只有所谓的MSS(maximun segment )和传输窗口
mss最大是1500-20-20
BOYGUARD110 2004-11-26
  • 打赏
  • 举报
回复

还有一个问题:

会不会 出现: send 函数发送一次的 数据, 需要 recv 函数 接收好几次 这种情况 ?

还是: 使用 send 函数 1 次 所发的数据 只要使用 recv 1 次 就可以全部接收 ?
BOYGUARD110 2004-11-26
  • 打赏
  • 举报
回复
up

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧