Какие биты в заголовке IP или TCP могут рассматриваться как пользовательский бит для передачи информации в контроллер? - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю с контроллером прожектора SDN и python розетками. Мне нужно 2 бита в поле заголовка заголовка tcp или ip, которое я могу использовать, поле заголовка, которое я могу изменить и установить по своему усмотрению.

Я хочу отправлять пакеты с настраиваемым полем (2 бита или более ) в заголовке tcp или ip. Я использовал приведенный ниже скрипт для создания заголовка TCP, но не смог найти места для установки битов для своих целей.

Одно из возможных решений, которое я нашел, состояло в том, что в заголовке tcp зарезервировано 6 битов, но я не могу установить зарезервированные биты.

Любое обсуждение или ответ помогут. Спасибо

Кредиты Сураджу Сингху за код: http://www.bitforestinfo.com/2017/12/code-to-create-tcp-packet-header-with-python-socket-module.html

 def create_tcp_feilds(self):

  # ---- [ Source Port ]

  self.tcp_src = self.sport

  # ---- [ Destination Port ]

  self.tcp_dst = self.dport

  # ---- [ TCP Sequence Number]

  self.tcp_seq = 0

  # ---- [ TCP Acknowledgement Number]

  self.tcp_ack_seq = 0

  # ---- [ Header Length ]

  self.tcp_hdr_len = 80

  # ---- [ TCP Flags ]

tcp_flags_rsv = (0 << 9) # <<< cant set this field

tcp_flags_noc = (0 << 8)

  tcp_flags_cwr = (0 << 7)

  tcp_flags_ecn = (0 << 6)

  tcp_flags_urg = (0 << 5)

  tcp_flags_ack = (0 << 4)

  tcp_flags_psh = (0 << 3)

  tcp_flags_rst = (0 << 2)

  tcp_flags_syn = (1 << 1)

  tcp_flags_fin = (0)

  self.tcp_flags_rsv=1

  self.tcp_flags = tcp_flags_rsv + tcp_flags_noc + tcp_flags_cwr + \
        tcp_flags_ecn + tcp_flags_urg + tcp_flags_ack + \
        tcp_flags_psh + tcp_flags_rst + tcp_flags_syn + tcp_flags_fin

  self.tcp_flags = 255

  print(self.tcp_flags)

  print(bin(self.tcp_flags))

  print(tcp_flags_rsv)

  # ---- [ TCP Window Size ]
  self.tcp_wdw = socket.htons (5840)

  # ---- [ TCP CheckSum ]
  self.tcp_chksum = 0

  # ---- [ TCP Urgent Pointer ]  
self.tcp_urg_ptr = 0


  return 

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я использовал опцию сокета, чтобы установить последние 2 бита TOS, известные как ECN. Спасибо @Sascha за понимание.

s.setsockopt(socket.SOL_IP,socket.IP_TOS,0x03)

Используя эту функцию, я могу установить поле TOS заголовка без создания необработанных сокетов.

0 голосов
/ 09 февраля 2020

А как насчет поля типа обслуживания (TOS), то есть второго байта заголовка IPv4?

В настоящее время первые шесть битов поля интерпретируются как DSCP (кодовая точка дифференцированных услуг), последние два бита интерпретируются как ECN (явное уведомление о перегрузке). ECN является необязательной функцией, поэтому, если ваши конечные точки не оценивают ее (скорее всего, нет), вы можете «сдвинуть» эти два бита для своего варианта использования.

Хорошо, что вы должны иметь возможность установить TOS (и, следовательно, ECN) на уровне приложения.

Более подробную информацию об этом можно найти здесь: https://en.wikipedia.org/wiki/Type_of_service и здесь: https://en.wikipedia.org/wiki/Explicit_Congestion_Notification

...