草庐IT

networking - 当我使用 TCP 连接时,我应该发送 Keep alive 数据包吗?

我的问题是,我已经创建了一个TCP连接,当它停留约1小时而没有传输任何数据时,它已经与服务器断开连接,但它没有通知我它已断开连接,我是否应该发送保持事件数据包到服务器?或者我应该从服务器向客户端发送keepalive数据包吗?还是我应该同时发送给两者? 最佳答案 是的,你应该。几天前我创建了一个TCP套接字/服务器应用程序,我遇到了同样的问题。我通过开始发送保持事件数据包来修复它。如果你发送保活数据包,你的问题就会消失。我听说有人说操作系统会为你发送保活数据包,我对此不是很熟悉,但发送保活数据包对我来说很明确

tcp - 在连续丢弃 SYN 数据包的情况下,最大重试次数是多少?

有一种产品(将保持未命名)存在特殊功能/问题。如果过载,它将丢弃新的SYN数据包。这对某些人来说似乎并非不合理。这在别人看来可能是不可想象的。无论如何。上游TCP客户端在放弃之前会重试发送SYN多少次?这个数字是基于RFC或标准还是只是行业规范?SCTP和INIT怎么样? 最佳答案 默认的TCP连接超时是您问题的基本主题,在客户端取决于平台,大约一分钟左右。这被编码到connect()中系统调用使用8、16、32秒的超时重试3次,具体取决于实现。在故障返回connect()之前,TCP堆栈也可能会进行自己的重试。功能,所以在最终EC

java - 已在 netbeans 中发送的数据包不会出现在 wireshark 或 cmd->netstat 中

我一直在尝试从一个简单的客户端向一个简单的服务器发送一个tcp/ip数据包...当我在netbeans中运行它们时,我从服务器得到响应,但我在wireshark中找不到数据包,如果我在cmd中使用netstat命令,数据包似乎也不存在......我尝试了几个不同的端口(8080、80、5000等),我使用的是本地主机作为IP地址。netbeans或wireshark中是否有我遗漏的某些设置,我仍需要配置?客户端:publicclassTCPClient{privatestaticInetAddresshost;privatestaticfinalintPORT=1235;publics

c - 非阻塞 tcp 套接字如何在发送失败的数据包上通知应用程序。

我正在为linux系统开发一个非阻塞的Ctcp套接字。我读过在非阻塞模式下,如果没有错误,“发送”命令将立即返回“发送的字节数”。我猜这个返回值实际上并不意味着这些数据已经传送到目的地,而是数据已经传递到内核内存以供其进一步处理和发送。如果是这样的话,我的应用程序如何知道内核真正向另一端发送了哪个数据包,假设网络连接有一些问题并且内核决定在一段时间内重试几次后放弃几分钟后?我问是因为我希望我的应用程序稍后再次重新发送那些失败的数据包。 最佳答案 Ifthatisthecase,howwouldmyapplicationknowwhi

c - 原始套接字中的 TCP 数据包 - Centos 6.6

我尝试执行TCP流量并在另一端使用RAW套接字捕获该数据包。我将窗口大小设置为50000字节。同时以最大速率发送TCP流量。我在wireshark中观察到每12个数据包(1512字节数据包)发送一个ACK​​。在原始套接字中接收数据包时。我预计会有12个数据包,就像我进入wireshark一样(我相信wireshark也使用原始套接字)。但是我很惊讶地看到一个数据包有发送数据流。据我所知,RAW套接字应该以有线传输的数据包形式接收,而不是TCP流。我在下面使用原始套接字在端口接收数据包rawsd=socket(PF_PACKET,SOCK_RAW,ETH_P_ALL);这是否与tcp_

java - 解析 TCP 数据包

我在解析来自套接字的TCP数据包时遇到了一些问题...在我的协议(protocol)中,我的消息是这样的:'A''B''C''D''E'.........0x2300'A''B''C''D''E'-->开始消息模式0x2300-->两个字节的结束信息但是由于Nagle'salgorithm,有时我的消息会像这样串联起来:'A''B''C''D''E'.........0x2300'A''B''C''D''E'........0x2300'A''B''C''D''E'.......0x2300我已经尝试将setNoDelay()设置为true,但问题仍然存在。我在byte[]中有消息。我

c# - 为什么我的 TCP 应用程序在快速发送时会丢失一些数据包

我正在使用异步套接字在C#中为每个服务器应用程序编写多个客户端。连接上的每个客户端发送10个项目。问题是,当快速启动大量客户端时,似乎每个客户端发送的项目少于10个,有时它什么也不发送,服务器只记录它们的连接。数据包结构是前4个字节是一个int,其中包含数据大小。这是服务器代码的一部分。每个连接的客户端都有自己的接收缓冲区,BeginReceive应该写入该缓冲区。privatevoidRecieve(IAsyncResultiar)//Calledwhensocketreceivessomething.{Socketserver_conn=(Socket)iar.AsyncState

Scala - 使用 Akka 的 TCP 数据包框架

在Akka中有什么方法可以像在Erlang中那样使用{packet,4}实现数据包框架?数据包看起来像这样:4byteslengthinbigendian|body...例如:00000005HELLO0005WORLD将是两个数据包“HELLO”和“WORLD”,但它们被作为一个数据包接收。或者00000005HELL现在Akka接收到这8个字节,但还缺少一个字节,它将在下一次调用“接收”时接收问题是我的Actor的接收总是被部分或全部请求调用,但我只想在接收中获得“body”部分,并且只有在它被完全接收时。因此,它所需要的只是首先读取这4个字节,然后等待读取其他N个字节(N=4字节

c - 如何识别 TCP 3 次握手中的初始数据包?

当客户端通过发送其初始数据包启动3次TCP握手时,AcknowledgmentNumber(请注意我在这里不是在谈论ACK标志)是否设置为0是真的吗?我有一个TCP跟踪文件,我使用C中的pcap库打印出每个数据包的特定信息。我注意到连接中第一个数据包的AcknowledgmentNumber始终设置为0。我可以将其用作识别TCPsession的第一个数据包的标准吗?如果不是那样,我可以使用哪些其他标准来将给定数据包识别为Web客户端发送的第一个数据包?仅仅查看SYN标志是行不通的,因为当服务器响应客户端的初始请求时,它也会设置其SYN标志。 最佳答案

sockets - 套接字编程,如果我写的数据超过一个 TCP/UDP 数据包会发生什么?

我有一个关于套接字编程的问题。当我使用套接字发送数据时,我们可以使用sendto()等API来使用TCP或UDP发送。对于sendto(),我们给出一个数组指针和我们要发送的字节数。在这种情况下,如果我给出一个大字节数(例如:20000字节),根据我的理解,网络的MTU不会那么大,所以套接字实际上发送多个数据包而不是一个大数据包。既然这20000字节被拆分成了几个UDP/TCP数据包,那么一开始这20000字节会不会被看成一个数据包呢?这个过程是UDP/TCP碎片吗?我的另一个问题是,如果我将小于MTU的数据放入sendto(),那么我可以保证调用一次sendto(),socket只发