TCP-сообщения объединяются - PullRequest
1 голос
/ 24 октября 2011

У меня есть приложение Java, которое пишет в сеть.Он пишет сообщения в районе 764b, +/- 5b.PCAP показывает, что поток получает фрагментированный IP-адрес, и мы не можем этого объяснить.

Linux 2.6.18-238.1.1.el5

Strace показывает:

( strace -vvvv -f -tt -o strace.out -e trace = network -p $ PID )

1: 2045  12:48:23.984173 sendto(45, "\0\0\0\0\0\0\2\374\0\0\0\0\0\3\n\0\0\0\0\3upd\365myData"..., 764, 0, NULL, 0) = 764
2: 15206 12:48:23.984706 sendto(131, "\0\0\0\0\0\0\2\374\0\0\0\0\0\3\n\0\0\0\0\3upd\365myData"..., 764, 0, NULL, 0 <unfinished ...>
3: 2046  12:48:23.984811 sendto(46, "\0\0\0\0\0\0\2\374\0\0\0\0\0\3\n\0\0\0\0\3upd\365myData"..., 764, 0, NULL, 0 <unfinished ...>
4: 15206 12:48:23.984893 <... sendto resumed> ) = 764
5: 2046  12:48:23.984948 <... sendto resumed> ) = 764

Я вижу пакеты, размер которых превышает MTU, когда я получаюсеть, которая вызывает фрагментацию.

4809   5.848987 10.0.0.2 -> 10.0.0.5 TCP 40656 > taiclock [ACK] Seq=325501 Ack=1 Win=46 Len=1448 TSV=344627654 TSER=270108068        # First Fragment
4810   5.848991 10.0.0.5 -> 10.0.0.2 TCP taiclock > 40656 [ACK] Seq=1 Ack=326949 Win=12287 Len=0 TSV=270108081 TSER=344627643       # TCP ack
4811   5.849037 10.0.0.2 -> 10.0.0.5 TCP 40656 > taiclock [PSH, ACK] Seq=326949 Ack=1 Win=46 Len=82 TSV=344627654 TSER=270108081    # Second Frag

Вопросы:

1) Похоже, что сервер пытается объединить два sendto () в один IP-пакет, который больше, чем MTU ипоэтому становится фрагментированным.Почему?

2) Рассматривает ли результат вывода для PID 2046, является ли цифра после знака равенства <... sendto resumed> строкой итоговой суммы за то, что было отправлено?Т.е. 764b было отправлено всего по строке 3 и строке 5?Или 764 байта отправляются на строку?

3) Есть ли какие-либо опции, которые я могу передать, чтобы вести к журналу все вывода sendto ()?Кажется, ничего не могу найти ..

1 Ответ

3 голосов
/ 24 октября 2011

Чтобы ответить на ваши вопросы, в следующем порядке:

1) Совершенно нормально, что несколько вызовов отправки объединяются при использовании TCP, поскольку это потоковый протокол, поэтому никоим образом не сохраняет границы отправки уровня пользователя.,Я не вижу никаких свидетельств фрагментации IP (что было бы плохо) в вашей трассировке, только сегментации TCP (что вполне нормально).

2) Да, это размер - точнее, этосообщение о значении, которое системный вызов вернул после его возобновления.

3) Вы можете использовать «-e write = all» или «-e write =», чтобы получить strace для отчета обо всех записанных данных.

...