gpt4 book ai didi

c - 为什么我的电脑一次性发送超过1514字节的数据包

转载 作者:行者123 更新时间:2023-11-30 18:41:34 25 4
gpt4 key购买 nike

我编写了一个程序,使用 TCP 客户端和服务器连续发送 1460 字节数据。我的系统接口(interface)MTU是1500。

这是我的客户端程序

if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
setsockopt(sockfd,SOL_TCP,TCP_NODELAY,&one,sizeof(one));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(9998);
serv_addr.sin_addr.s_addr = inet_addr("10.10.12.1");

if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
{
printf("\n Error : Connect Failed \n");
return 1;
}

while(1)
{
write(sockfd, send_buff, 1448) ;

}

在wireshark中,最初的15到30个数据包显示1514字节的数据包正在传输,但随后显示如下

wireshark输出一些数据包

No.     Time        Source                Destination           Protocol Length Info
16 0.000000 10.10.12.2 10.10.12.1 TCP 5858 53649 > distinct32 [ACK] Seq=3086892290 Ack=250285353 Win=14608 Len=5792 TSval=23114307 TSecr=23833274

Frame 16: 5858 bytes on wire (46864 bits), 5858 bytes captured (46864 bits)
Ethernet II, Src: 6c:3b:e5:14:9a:a2 (6c:3b:e5:14:9a:a2), Dst: Ibm_b5:86:85 (00:1a:64:b5:86:85)

Internet Protocol Version 4, Src: 10.10.12.2 (10.10.12.2), Dst: 10.10.12.1 (10.10.12.1)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
Total Length: 5844
Identification: 0x8480 (33920)
Flags: 0x00
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0xb38d [correct]
Source: 10.10.12.2 (10.10.12.2)
Destination: 10.10.12.1 (10.10.12.1)

Transmission Control Protocol, Src Port: 53649 (53649), Dst Port: distinct32 (9998), Seq: 3086892290, Ack: 250285353, Len: 5792
Source port: 53649 (53649)
Destination port: distinct32 (9998)
[Stream index: 0]
Sequence number: 3086892290
[Next sequence number: 3086898082]
Acknowledgement number: 250285353
Header length: 32 bytes
Flags: 0x010 (ACK)
Window size value: 913
[Calculated window size: 14608]
[Window size scaling factor: 16]
Checksum: 0x42dd [validation disabled]
Options: (12 bytes)
No-Operation (NOP)
No-Operation (NOP)
Timestamps: TSval 23114307, TSecr 23833274

Data (5792 bytes)

在wireshark上显示超过5792、7000、65535字节的数据包正在传输。但我一次性发送了 1514 字节的数据包。另一方面,由于网络 MTU,我仅收到 1514 字节的数据包。

所以我的问题是

为什么会有这么多大数据包?

我也尝试过不使用 NODELAY 选项,但它不起作用。

是否有任何解决方案可以发送特定数据包大小(例如 1514 字节),而不发送巨型帧?

我也更新了 tcp_rmem 和 tcp_wmem,用于 tcp 发送缓冲区和接收缓冲区。但没有找到任何解决办法。

最佳答案

TCP 按照设计,将多个 write() 调用捆绑到更大的数据包中。此外,TCP 默认情况下根据 Nagle's Algorithm 合并数据包。 .

如果您想更好地控制网络数据包的实际大小,请使用 UDP。

关于c - 为什么我的电脑一次性发送超过1514字节的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20853398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com