Проблема возникает при приеме измененных пакетов. Отправляется и доходит правильно сформированный пакет, обрабатывается на клиенте, но не доходит приложению. PS:Wireshark показывает, что пакеты доходят и обрабатываются как надо.
http://en.wikipedia.org/wiki/Transmission_Control_Protocol Просто так добавить данные в конец пакета нельзя. Тебе надо ещё переписать sequence numbers. А как только ты это тронешь то получишь разные логические потоки на обоих сторонах своего драйвера. Т.е. что бы это работало тебе в драйвере надо пересчитывать sequence+ack в обоих направлениях... P.S. посмотри sequence number tracking в Wireshark.
В том то и дело, что sequence номера идут правильно, но не отправляется подтверждение о приеме данных с клиента, т. е. идет постоянная перепосылка пакета с данными. PS: смотрел номера в wireshark на клиенте.
Что значит правильно? Опиши точно что ты делаешь с data пакетом, что ожидаешь увидить в ack, и что будешь с ним делать.
Устанавливается соединение клиент(К)-сервер(С). K -> C Seq(X) C -> K Seq(Y) Ack(X+1) K -> C Seq(X+1) Ack(Y+1) Потом на сервере обрабатывается пакет с передаваемыми данными: добавляется некое число байт (bytes) к полю данных. C -> K Seq(Y+1) Ack(X+1) Клиент на приеме считывает это поле данных и мы убираем добавленные ранее байты. Затем сервер передает пакет, говорящий об окончании передачи с флагом FIN. C -> K Seq(Y+1+bytes) Ack(X+1) Клиент на приеме уменьшает Seq на число bytes. После всего клиент высылает подтверждение о принятом пакете и разрывает соединение. K -> C Seq(X+1) Ack(Y+2)
Что-то ты кривовато описал TCP. Вот две фазы которые тебя интересуют: 1) handshake: SYN(seq=X, ack=0), SYN+ACK(seq=Y, ack=X+1), ACK(seq=X+1,ack=Y+1) - sequence/acknowledgment номера увеличиваются на 1 2) main mode: PUSH(seq=N)+data(d bytes), ACK(ack=N+d) - sequence/acknowledgment номера увеличиваются на кол-во полученных байтов. Поэтому, если ты воткнул в пакет "z" новых байтов и поправил checksum, то: a) получишь назад ack c "ack=N+d+z" при условии что всё дошло правильно. Этот ack тебе надо поправить до передачи. б) следующий пакет с данными должен иметь "seq=N+d+z+d2" при передачи d2 байтов. P.S. там ещё есть вопрос IP fragmentation