C语言 关于执行新的传输协议



我正在尝试实现我自己的传输层协议,例如TCP,该协议将被某些应用程序使用,在Linux中使用原始套接字API的网络层之上。我正在研究 Ubuntu 14.04。

我已经能够发送和接收数据包。

现在在实现传输协议的部分,我期待着编写一些函数,例如

connect(int sockfd( - 建立与服务器的连接。

send_data(int sockfd, char* data( - 发送数据

receive_data(int sockfd, char* data( - 接收数据

关闭(int sockfd( - 关闭连接

另外,由于我正在尝试实现像TCP这样的协议,为了保持协议的可靠性,我想为每个收到的数据包发送确认。我已经制作了自己的TCP头,如下所示

typedef struct rtlp_hdr
{
    int         checksum; 
    short int   src_port;  //defined by us
    short int   des_port;  //defined by us
    int         seq_no;
    int         ack_no;
}rtlp_hdr;

现在,在发送数据包后的send_data函数的实现中,我等待在给定的时间内接收下一个数据包的确认,如果我没有收到任何确认或收到损坏的ack(在检查校验和后(我重新发送数据。我在为相同的函数创建相应的 receive_data 函数时遇到了问题,例如我如何知道为接收的数据发送的 ack 已成功传递给发送方,因为没有 ack 的 ack。

如果有人有任何想法,我能做什么,或者如果我走错了方向,请纠正我。 提前谢谢。

我已经使用 3 向握手为 connect(int sockfd( 编写了代码,工作正常,我可以分享。

如前所述,无法保证消息到达目的地。如果我正确理解您的问题,我希望下面的简单示例可以帮助您。

您有一个客户端 A,一个服务器 B。客户端 A 向 B 发送一个名为 A1 的数据包。B 保存上次收到的数据包的名称,并使用 ack 回复 A。

如果确认到达客户端,它会发送下一个数据包,名为 A2。

但是,如果确认丢失,客户端会在一段时间后重新发送名为 A1 的数据。当服务器第二次收到 A1(使用保存的名称(时,它可以假定确认已丢失。然后服务器重新发送确认,希望这次它能到达客户端。这根据需要持续多次。

如您所见,服务器不需要知道确认是否已交付给客户端。收到重复的数据包会告诉服务器确认已丢失。(为简单起见,忽略虚假超时(

你正面临着拜占庭将军的协议问题:永远无法保证消息到达。如果您发送消息以确认消息已到达,则可能不会到达;如果您发送投票来查询消息是否已到达,它可能永远不会到达,或者它的答案可能永远不会到达......

因此,协议充其量只能是"最可靠的",在您的设计中,您必须包括未到达,并且您的软件必须能够应对它。"软件"可能意味着一直到应用层。

最新更新