Я играю с scapy, пытаясь сделать nmap-like, мне удалось выполнить трехстороннее рукопожатие, и я автоматически получаю данные, если подключаюсь к SMTP-серверу, но я не могу признать это.Номер Ack для подтверждения данных в scapy
Я подключился к нему через netcat, чтобы узнать, почему он не работает, и nc действительно отправляет ACK-пакет с полем TCP ack, установленным на длину полученного сегмента данных. 1. Итак, я пытаюсь сделать то же самое с scapy, но я не знаю, где найти длину сегмента TCP. Я попробовал lsc (TCP), но я не вижу поля.
Вот Wireshark захват связи NetCat:
И деталь пакета:
Как вы можете видеть, извед поле пакета чуть ниже данных 37 + 1 = 38.
Кто-нибудь знает, где и как это может быть und?
EDIT:
Там фактически нет поля, что дает длину сегмента, но она может быть рассчитана двумя способами:
tcp_seg_len = len(rp.getlayer(Raw).load)
# or
ip_total_len = rp.getlayer(IP).len
ip_header_len = rp.getlayer(IP).ihl * 32/8
tcp_header_len = rp.getlayer(TCP).dataofs * 32/8
tcp_seg_len = ip_total_len - ip_header_len - tcp_header_len
ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \
dport=pkt[1].sport, \
seq=rp[1].ack, \
ack=tcp_seg_len + 1, \
flags="A"), \
verbose=0, timeout=1)
Однако, когда я печатаю значения я получаю хороший номер Ack, но когда я смотрю захват wirehark, у меня есть огромный номер ack, и пакет помечен как «ACKed unseen segment». Когда я смотрю на байты в гекса, я получил правильное значение. Кто-нибудь знает, почему это происходит и как его решить?