Почему длина сегмента TCP не отличается в одной и той же последовательности TCP при использовании сетевой карты Exanic X ⇐ C++
Почему длина сегмента TCP не отличается в одной и той же последовательности TCP при использовании сетевой карты Exanic X
Ниже приводится описание моей проблемы. Я использовал один сетевой адаптер Cisco Nexus SmartNIC K35-S (ранее Exanic X10 NIC) для зеркалирования данных TCP и анализа этих пакетов. Процесс получения данных кадра от сетевого адаптера X10 находится в цикле while, и он был помещен в один поток (использовался поток C++ 11). Чтобы ускорить анализ данных, я использовал внутреннюю связь с нулевым процессом для обработки данных буфера кадра X10.
void get_exanic_frame(exanic_t *exanic, exanic_rx_t *exanic_rx) { буфер символов [2048]; exanic_cycles32_t временная метка; exanic_cycles_t timestamp_64; пока (g_running) { sz = exanic_receive_frame (exanic_rx, буфер, sizeof (буфер), & отметка времени); msg_t сообщение; msg.frame.len = static_cast(sz - 4); memcpy(msg.frame.buf, буфер, sz - 4); int rc = zmq_send(zmq_send_sock, &msg, sizeof(msg_t), 0); ТЕСТ (rc == sizeof (msg_t)); } } void zmq_recv_sock_thread() { пока (g_running) { msg_t сообщение; int rc = zmq_recv(zmq_proc_sock, &msg, sizeof(msg_t), ZMQ_DONTWAIT); если (0 > rc) { TEST(EINTR == ошибка || EAGAIN == ошибка); } еще { handle_zmq_recv (мсг); спать(10); } } } void proc_msg_init_zmq() { интервал RC, Вал; zmq_send_sock = zmq_socket(zmq_ctx, ZMQ_PAIR); ТЕСТ (zmq_send_sock); вал = ZMQ_SNDHWM_VAL; rc = zmq_setsockopt(zmq_send_sock, ZMQ_RCVHWM, &val, sizeof(val)); ТЕСТ (0 == RC); вал = ZMQ_RCVHWM_VAL; rc = zmq_setsockopt(zmq_send_sock, ZMQ_SNDHWM, &val, sizeof(val)); ТЕСТ (0 == RC); rc = zmq_bind(zmq_send_sock, ZMQ_INPROC_ADDR); } недействительный Recv_init_zmq() { интервал RC, Вал; zmq_proc_sock = zmq_socket(zmq_ctx, ZMQ_PAIR); ТЕСТ (zmq_proc_sock); вал = ZMQ_RCVHWM_VAL; rc = zmq_setsockopt(zmq_proc_sock, ZMQ_RCVHWM, &val, sizeof(val)); ТЕСТ (0 == RC); вал = ZMQ_SNDHWM_VAL; rc = zmq_setsockopt(zmq_proc_sock, ZMQ_SNDHWM, &val, sizeof(val)); ТЕСТ (0 == RC); rc = zmq_connect(zmq_proc_sock, ZMQ_INPROC_ADDR); ТЕСТ (0 == RC); } следующий код находится в основной функции.
thread md_recv(get_exanic_frame, exanic, exanic_rx); zmq_recv_sock_thread эта функция находится в основном потоке. В то же время запускаю программу и использую команду tcpdump для захвата TCP-пакетов на одном и том же интерфейсе сетевой карты. Наконец, я обнаружил проблему, заключающуюся в том, что до тех пор, пока не будет создана одна TCP-последовательность, длина TCP-сегмента не отличается от файла pcap из tcpdump. .Так что же вызывает эту проблему?
Данные кадра, полученные от Exanic X10 с помощью вызова функции exanic_receive_frame(), должны быть идентичны данным кадра из файлов pcap, сгенерированных командой tcpdumping на том же интерфейсе NIC. Но результат программы не имеет того же размера сегмента TCP в соответствующей последовательности TCP, что и сегмент в файле pcap. Поэтому я хочу найти решение этой проблемы.
Ниже приводится описание моей проблемы. Я использовал один сетевой адаптер Cisco Nexus SmartNIC K35-S (ранее Exanic X10 NIC) для зеркалирования данных TCP и анализа этих пакетов. Процесс получения данных кадра от сетевого адаптера X10 находится в цикле while, и он был помещен в один поток (использовался поток C++ 11). Чтобы ускорить анализ данных, я использовал внутреннюю связь с нулевым процессом для обработки данных буфера кадра X10.
void get_exanic_frame(exanic_t *exanic, exanic_rx_t *exanic_rx) { буфер символов [2048]; exanic_cycles32_t временная метка; exanic_cycles_t timestamp_64; пока (g_running) { sz = exanic_receive_frame (exanic_rx, буфер, sizeof (буфер), & отметка времени); msg_t сообщение; msg.frame.len = static_cast(sz - 4); memcpy(msg.frame.buf, буфер, sz - 4); int rc = zmq_send(zmq_send_sock, &msg, sizeof(msg_t), 0); ТЕСТ (rc == sizeof (msg_t)); } } void zmq_recv_sock_thread() { пока (g_running) { msg_t сообщение; int rc = zmq_recv(zmq_proc_sock, &msg, sizeof(msg_t), ZMQ_DONTWAIT); если (0 > rc) { TEST(EINTR == ошибка || EAGAIN == ошибка); } еще { handle_zmq_recv (мсг); спать(10); } } } void proc_msg_init_zmq() { интервал RC, Вал; zmq_send_sock = zmq_socket(zmq_ctx, ZMQ_PAIR); ТЕСТ (zmq_send_sock); вал = ZMQ_SNDHWM_VAL; rc = zmq_setsockopt(zmq_send_sock, ZMQ_RCVHWM, &val, sizeof(val)); ТЕСТ (0 == RC); вал = ZMQ_RCVHWM_VAL; rc = zmq_setsockopt(zmq_send_sock, ZMQ_SNDHWM, &val, sizeof(val)); ТЕСТ (0 == RC); rc = zmq_bind(zmq_send_sock, ZMQ_INPROC_ADDR); } недействительный Recv_init_zmq() { интервал RC, Вал; zmq_proc_sock = zmq_socket(zmq_ctx, ZMQ_PAIR); ТЕСТ (zmq_proc_sock); вал = ZMQ_RCVHWM_VAL; rc = zmq_setsockopt(zmq_proc_sock, ZMQ_RCVHWM, &val, sizeof(val)); ТЕСТ (0 == RC); вал = ZMQ_SNDHWM_VAL; rc = zmq_setsockopt(zmq_proc_sock, ZMQ_SNDHWM, &val, sizeof(val)); ТЕСТ (0 == RC); rc = zmq_connect(zmq_proc_sock, ZMQ_INPROC_ADDR); ТЕСТ (0 == RC); } следующий код находится в основной функции.
thread md_recv(get_exanic_frame, exanic, exanic_rx); zmq_recv_sock_thread эта функция находится в основном потоке. В то же время запускаю программу и использую команду tcpdump для захвата TCP-пакетов на одном и том же интерфейсе сетевой карты. Наконец, я обнаружил проблему, заключающуюся в том, что до тех пор, пока не будет создана одна TCP-последовательность, длина TCP-сегмента не отличается от файла pcap из tcpdump. .Так что же вызывает эту проблему?
Данные кадра, полученные от Exanic X10 с помощью вызова функции exanic_receive_frame(), должны быть идентичны данным кадра из файлов pcap, сгенерированных командой tcpdumping на том же интерфейсе NIC. Но результат программы не имеет того же размера сегмента TCP в соответствующей последовательности TCP, что и сегмент в файле pcap. Поэтому я хочу найти решение этой проблемы.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Std :: fileystem :: canonical преобразует сопоставленный сетевой диск в сетевой путь
Anonymous » » в форуме C++ - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Std :: fileystem :: canonical преобразует сопоставленный сетевой диск в сетевой путь
Anonymous » » в форуме C++ - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Std :: fileystem :: canonical преобразует сопоставленный сетевой диск в сетевой путь
Anonymous » » в форуме C++ - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-