A data transmission method, wherein the method comprises: obtaining, by a first communications device, an i th data packet in S data packets, wherein S is a positive integer, and i is any positive integer ranging from 1 to S; dividing, by the first communications device, the i th data packet into N i data blocks, and performing fountain-code encoding on the N i data blocks to generate K i fountain-code codewords, wherein N i is an integer greater than 1, and K i is an integer greater than 1; generating, by the first communications device, K i protocol data units, PDUs, based on the K i fountain-code codewords, and starting to send, by the first communication device, the K i PDUs to a second communications device; and when the first communications device receives first acknowledgement information sent by the second communications device, stopping, by the first communications device based on the first acknowledgement information, sending a to-be-sent PDU in the K i PDUs to the second communications device, wherein the first acknowledgement information is used to indicate that the second communications device has correctly received the i th data packet wherein the first communications device and the second communications device perform data transmission through forwarding by a fourth communications device; characterized in that, after the first communications device receives the first acknowledgement information sent by the second communications device, the method further comprises: sending, by the first communications device, transmission stop information to the fourth communications device, wherein the transmission stop information is used to instruct the fourth communications device to discard a PDU in the K i PDUs that has been stored; receiving, by the first communications device, status information of at least one other data packet wherein the status information is indicative of a receiving status of the at least one other data packet and is received from the second communications device, and adjusting, by the first communications device, a sending quantity and a sending rate for each data packet separately based on the status information of each data packet. obtaining, by a first communications device, an i th data packet in S data packets, wherein S is a positive integer, and i is any positive integer ranging from 1 to S; dividing, by the first communications device, the i th data packet into N i data blocks, and performing fountain-code encoding on the N i data blocks to generate K i fountain-code codewords, wherein N i is an integer greater than 1, and K i is an integer greater than 1; generating, by the first communications device, K i protocol data units, PDUs, based on the K i fountain-code codewords, and starting to send, by the first communication device, the K i PDUs to a second communications device; and when the first communications device receives first acknowledgement information sent by the second communications device, stopping, by the first communications device based on the first acknowledgement information, sending a to-be-sent PDU in the K i PDUs to the second communications device, wherein the first acknowledgement information is used to indicate that the second communications device has correctly received the i th data packet wherein the first communications device and the second communications device perform data transmission through forwarding by a fourth communications device; characterized in that, after the first communications device receives the first acknowledgement information sent by the second communications device, the method further comprises: sending, by the first communications device, transmission stop information to the fourth communications device, wherein the transmission stop information is used to instruct the fourth communications device to discard a PDU in the K i PDUs that has been stored; receiving, by the first communications device, status information of at least one other data packet wherein the status information is indicative of a receiving status of the at least one other data packet and is received from the second communications device, and adjusting, by the first communications device, a sending quantity and a sending rate for each data packet separately based on the status information of each data packet. sending, by the first communications device, transmission stop information to the fourth communications device, wherein the transmission stop information is used to instruct the fourth communications device to discard a PDU in the K i PDUs that has been stored; receiving, by the first communications device, status information of at least one other data packet wherein the status information is indicative of a receiving status of the at least one other data packet and is received from the second communications device, and adjusting, by the first communications device, a sending quantity and a sending rate for each data packet separately based on the status information of each data packet.