On 03. 10. 23 11:25, Jan Petto wrote:
For my research, I am sending DNS requests over TCP to many different recursive DNS servers all over the world. A significant portion of these servers is sending the DNS response in two separate TCP segments, even though it would easily fit into one packet. Only after my client has acknowledged the first segment, the second part of the response is sent. The first TCP segment always contains only one or two bytes, never more.

I know a DNS message sent over TCP is prefixed by a two-byte field containing the message length. My first thought was that the first TCP segment contains this length field, and the second segment contains the DNS message, but then I discovered cases where only one of the two length bytes was contained in the first segment. In any case, sending the message length as a separate packet does not make much sense to me from an application design perspective. Maybe this is some sort of attack mitigation?

I have attached a packet capture containing two such examples. You can reproduce the behavior with any DNS client, e.g. dig:

# dig example.org +tcp @100.37.202.139

Also attached is a list of public DNS server IP addresses, where I have observed this behavior. They were found via scans of the IP address space, I have no affiliation with these servers.

I would greatly appreciate any input as to why so many servers are sending their responses in such a way.

I bet it's just suboptimal implementation on some SOHO router or something like that.

There are two things at play, I believe:
- Responder apparently does not use TCP_CORK (see "man tcp") or a userspace equivalent. - Kernel is very relatex when it comes to TCP protocol segmentation. Nothing prescribes that TCP streams MUST be segmented in some sort of optimal way.

--
Petr Špaček
Internet Systems Consortium

_______________________________________________
dns-operations mailing list
[email protected]
https://lists.dns-oarc.net/mailman/listinfo/dns-operations

Reply via email to