LINUX.ORG.RU

Вопрос про трёхэтапное рукопожатие TCP


0

0

В общем проблема такая, решил реализовать на уровне SOCK_RAW тройное рукопожатие SYN, SYN/ACK, ACK.

Вроде написал, в итоге получается, что в ответ на мой последний ACK мне приходит пакет о разрыве соединения, то есть с флагом RST.

вот как работает моя програма, я отследил пакеты, которые приходя и уходят на сервер

code: ==ETHERNET_HEADER============================ MAC destination :00:0c:29:23:69:71 MAC source :00:0c:29:0f:63:d0 Packet type ID field :0x800 ==IP_HEADER================================== IP version :4 IP header length :5 TOS :0 Total length :40 ID :3290 Fragment offset :0x4000 MF :0 DF :1 TTL :64 Protocol :6 IP source :192.168.234.128 IP destination :192.168.234.129 ==TCP_HEADER================================= Port source :1554 Port destination :80 Sequence number :100 Ack number :0 Data offset :5 FIN:0,SYN:1,RST:0,PSH:0,ACK:0,URG:0,ECE:0,CWR:0 Window :5840 Urgent pointer :0 ############################################# ==ETHERNET_HEADER============================ MAC destination :00:0c:29:0f:63:d0 MAC source :00:0c:29:23:69:71 Packet type ID field :0x800 ==IP_HEADER================================== IP version :4 IP header length :5 TOS :0 Total length :44 ID :0 Fragment offset :0x4000 MF :0 DF :1 TTL :64 Protocol :6 IP source :192.168.234.129 IP destination :192.168.234.128 ==TCP_HEADER================================= Port source :80 Port destination :1554 Sequence number :35398 Ack number :100 Data offset :6 FIN:0,SYN:1,RST:0,PSH:0,ACK:1,URG:0,ECE:0,CWR:0 Window :5840 Urgent pointer :0 ############################################# ==ETHERNET_HEADER============================ MAC destination :00:0c:29:23:69:71 MAC source :00:0c:29:0f:63:d0 Packet type ID field :0x800 ==IP_HEADER================================== IP version :4 IP header length :5 TOS :0 Total length :40 ID :3291 Fragment offset :0 MF :0 DF :0 TTL :64 Protocol :6 IP source :192.168.234.128 IP destination :192.168.234.129 ==TCP_HEADER================================= Port source :1554 Port destination :80 Sequence number :100 Ack number :35398 Data offset :5 FIN:0,SYN:0,RST:0,PSH:0,ACK:1,URG:0,ECE:0,CWR:0 Window :5840 Urgent pointer :0 ################################

а вот как устраиват соединение к примеру оперы с этим же сервером(пробовал в основном на HTTP) code: ==ETHERNET_HEADER============================ MAC destination :00:50:56:c0:00:08 MAC source :00:0c:29:0f:63:d0 Packet type ID field :0x800 ==IP_HEADER================================== IP version :4 IP header length :5 TOS :0 Total length :48 ID :47188 Fragment offset :0x4000 MF :0 DF :1 TTL :128 Protocol :6 IP source :192.168.234.1 IP destination :192.168.234.129 ==TCP_HEADER================================= Port source :3626 Port destination :80 Sequence number :45732 Ack number :0 Data offset :7 FIN:0,SYN:1,RST:0,PSH:0,ACK:0,URG:0,ECE:0,CWR:0 Window :65535 Urgent pointer :0 ############################################# ==ETHERNET_HEADER============================ MAC destination :00:0c:29:0f:63:d0 MAC source :00:50:56:c0:00:08 Packet type ID field :0x800 ==IP_HEADER================================== IP version :4 IP header length :5 TOS :0 Total length :48 ID :0 Fragment offset :0x4000 MF :0 DF :1 TTL :64 Protocol :6 IP source :192.168.234.129 IP destination :192.168.234.1 ==TCP_HEADER================================= Port source :80 Port destination :3626 Sequence number :51156 Ack number :45732 Data offset :7 FIN:0,SYN:1,RST:0,PSH:0,ACK:1,URG:0,ECE:0,CWR:0 Window :5840 Urgent pointer :0 ############################################# ==ETHERNET_HEADER============================ MAC destination :00:50:56:c0:00:08 MAC source :00:0c:29:0f:63:d0 Packet type ID field :0x800 ==IP_HEADER================================== IP version :4 IP header length :5 TOS :0 Total length :40 ID :47190 Fragment offset :0x4000 MF :0 DF :1 TTL :128 Protocol :6 IP source :192.168.234.1 IP destination :192.168.234.129 ==TCP_HEADER================================= Port source :3626 Port destination :80 Sequence number :45732 Ack number :51156 Data offset :5 FIN:0,SYN:0,RST:0,PSH:0,ACK:1,URG:0,ECE:0,CWR:0 Window :65535 Urgent pointer :0 ################################

Вроде как вы видите, все почти одинаково, но опера получается статус ESTABLISHED, а со своей программой SYN_RESV, что-то в этом духе.

Еще проверил утилитой tcpdum получилось вот так,

моя программа: code: 12:15:31.504190 IP 192.168.234.128.1550 > 192.168.234.129.www: S 6553600:6553600(0) win 5840 12:15:31.739613 IP 192.168.234.129.www > 192.168.234.128.1550: S 534606125:534606125(0) ack 6553601 win 5840 <mss 1460> 12:15:31.761737 IP 192.168.234.128.1550 > 192.168.234.129.www: . ack 36563 win 5840 12:15:31.761819 IP 192.168.234.129.www > 192.168.234.128.1550: R 534642688:534642688(0) win 0

К примеру опера code: 12:16:12.184171 IP 192.168.234.1.3846 > 192.168.234.129.www: S 470605274:470605274(0) win 65535 <mss 1460,nop,nop,sackOK> 12:16:12.184198 IP 192.168.234.129.www > 192.168.234.1.3846: S 564727089:564727089(0) ack 470605275 win 5840 <mss 1460,nop,nop,sackOK> 12:16:12.184201 IP 192.168.234.1.3846 > 192.168.234.129.www: . ack 1 win 65535 12:16:12.184204 IP 192.168.234.1.3846 > 192.168.234.129.www: P 1:448(447) ack 1 win 65535 12:16:12.184207 IP 192.168.234.129.www > 192.168.234.1.3846: . ack 448 win 6432 12:16:12.187241 IP 192.168.234.129.www > 192.168.234.1.3846: P 1:194(193) ack 448 win 6432 12:16:12.325257 IP 192.168.234.1.3846 > 192.168.234.129.www: . ack 194 win 65342

Может кто знает, как быть, что нужно сделать, чтобы соединение прошло успешно?

ужасно смотрится пост :)

Судя по логам tcpdump, пакет rst приходит не тебе, а его посылает твоя ОС. А посылает, потому что видит непонятно откуда нарисовавшийся syn/ack пакет. Ну и выход - закрыть, например, файерволом посылку этого rst.

Chumka ★★★
()
Ответ на: комментарий от mcsaimer

Ты не вкурил. Нужно прописать на клиенте, чтобы он не посылал RST на сервер, вернее, чтобы посылаемые клиентом пакеты RST не доходили до сервера.

Chumka ★★★
()
Ответ на: комментарий от Chumka

Это ты не вкурил, на машине клиента, прописано чтобы никаких пакетов оперционка не получала от сервера(с кем соединение устраиваем), так что машина клиента не может отправить РСТ пакет, потому что до нее не дойдет SYN/ACK пакет от сервера.

mcsaimer
() автор топика
Ответ на: комментарий от mcsaimer

Ты видишь тоже что и я? Лог tcp-дампа. Твоя клиентская машина шлет RST в ответ на syn/ack. И то что ты говоришь, что "до нее не дойдет SYN/ACK пакет от сервера" - бред полнейший. Ты сам видишь, что он дошел. Ты работаешь с RAW сокетами! Как по-твоему tcpdump, libpcap и т.д. захватывают пакеты, которые блокированы файрволом? :) Короче, делай, как я тебе изначально сказал, и будет у тебя счастье.

Chumka ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.