Я реализовал TCP рукопожатие, которое работает с некоторыми серверами в Интернете.
Я попытался подключиться к своему локальному демонстрационному серверу, созданному с помощью следующих нескольких строк Python:
import socket
sock = socket.socket(sock.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 5678))
sock.listen(1)
conn, addr = sock.accept()
print(conn, addr)
SYN пакетсоздан с помощью Scapy
from random import getrandbits
ip = IP(dst="127.0.0.1")
tcp = TCP(dport=5678, sport=7890, flags="S", seq=getrandbits(16))
packet = ip / tcp
send(packet)
Когда я проверил поток в Wireshark, для этого пакета не было ответа, но когда я проверил поток на sock.connect(("localhost", 5678))
, я увидел, что все в порядке (SYN -> SYN/ACK -> ACK
), но контрольная сумма помечена как неверно с сообщением может быть вызвано «Разгрузка контрольной суммы TCP»? .
Когда я пытался получить необработанные пакеты (из этого ответа ) яполучил действительный пакет SYN.
Что не так с пакетом SYN?Как я могу вручную подключиться к серверу, используя socket.accept()
?