LINUX.ORG.RU

Сообщения mcsaimer

 

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

В общем проблема такая, решил реализовать на уровне 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

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

mcsaimer
()

RSS подписка на новые темы