我试图实现我自己的传输层协议,像TCP,这个协议将被一些应用程序使用,在Linux的networking层上使用原始套接字API。 我正在使用Ubuntu 14.04。
我已经能够发送和接收数据包。
现在在执行运输协议方面,我期待着写一些类似的function
connect(int sockfd) – build立到服务器的连接。
send_data(int sockfd,char * data) – 发送数据
receive_data(int sockfd,char * data) – 接收数据
closures(int sockfd) – closures连接
此外,因为我正在尝试实现像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或者收到损坏的ack(在检查校验和之后)我重新发送数据。 我正在为创build相应的receive_data函数遇到问题,就像我怎么会知道为接收到的数据发送的ack已经成功发送给发送者,因为没有ack ack。
如果有人有任何想法,我可以做什么,如果我走错了方向,请纠正我。 提前致谢。
我已经写了代码连接(int sockfd)使用3方式握手工作正常,我可以分享。
如上所述,没有办法保证消息到达目的地。 如果我理解你的问题,我希望下面的简单例子可以帮助你。
您有一个客户端A和一个服务器B.客户端A向B发送一个名为A1的数据包.B保存最后一个接收到的数据包的名称,并用ack答复A.
如果ack发送到客户端,它发送下一个名为A2的数据包。
但是,如果确认失败,则客户在一段时间后重新发送名为A1的数据。 当服务器第二次收到A1(使用保存的名称)时,可以认为确认丢失。 服务器然后重新发送确认,希望这次将它送到客户端。 这需要继续多少次。
正如你所看到的,服务器不需要知道确认是否已经交付给客户端。 重复数据包的接收告诉服务器确认丢失。 (为简单起见,忽略虚假超时)
你正面临着拜占庭将军的协议问题 :从来没有保证消息到达。 如果您发送消息来确认消息已到达,则可能无法到达; 如果您发送投票来查询邮件是否已经到达,它可能永远不会到达,否则其答案可能永远不会到达。
所以,协议最好是“大多数可靠的”,在你的设计中你必须包含未到达,你的软件必须能够应付它。 “软件”可能意味着一直到应用程序层。