издержки записи () и TCP / IP - PullRequest
       11

издержки записи () и TCP / IP

2 голосов
/ 14 февраля 2011

Если я пишу в дескриптор файла сокета, используя байты write (),

  • Является ли каждый байт пакетом?
  • будет ли сокет добавлять заголовок TCP / IP к каждому байту?
  • Или у него есть буферный механизм (лично я в этом сомневаюсь, поскольку у меня нет явного сброса).

Например:

write(fd, 'a', 1);
write(fd, 'b', 1);
write(fd, 'c', 1);

Будет ли это менее эффективно, чем, скажем,

write (fd, 'abc', 3);
  • Я должен спросить это здесь, потому что у меня нет опыта для мониторинга заголовка TCP / IP в трафике. Благодаря.

Ответы [ 3 ]

3 голосов
/ 14 февраля 2011

Нет, не каждый байт станет пакетом.Некоторые могут быть объединены из-за Алгоритма Нэгла и других вещей.Для каждого пакета будет один заголовок TCP, а не для байта.

При этом следует избегать вызова байта записи / отправки по байтам, поскольку каждый из них является системным вызовом, который дорог (на локальной машине, а не нас точки зрения того, как он попадает в сеть).

1 голос
/ 14 февраля 2011

Добавляя к ответу Джона, вы можете отключить Алгоритм Нейгла (через TCP_NODELAY), и тогда первая версия станет медленнее.

И наоборот, вы можете вызвать writev() вместо write(), что приведет к тому, что первая версия будет работать точно так же, как и вторая.

0 голосов
/ 14 февраля 2011

Это действительно зависит от реализации стека TCP / IP. Это действительно будет зависеть от сегментации, которая реализована в ОС. В большинстве ОС уже встроена большая оптимизация.

Если вы смотрите в худшем случае, заголовок TCP равен 20 байтам, заголовок IP равен 20 байтам и размер заголовка кадра (в зависимости от используемого протокола, возможно, Ethernet) Можно ожидать, что плюс ваша полезная нагрузка. Тем не менее, большая часть трафика в Интернете принадлежит ACK, однако ваш сетевой стек должен объединять полезные нагрузки.

...