Вставка NDIS пакетов в очередь

Тема в разделе "WASM.NT.KERNEL", создана пользователем amn, 4 фев 2009.

  1. amn

    amn New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2009
    Сообщения:
    12
    Проблема возникает при приеме измененных пакетов. Отправляется и доходит правильно сформированный пакет, обрабатывается на клиенте, но не доходит приложению.

    PS:Wireshark показывает, что пакеты доходят и обрабатываются как надо.
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    http://en.wikipedia.org/wiki/Transmission_Control_Protocol

    Просто так добавить данные в конец пакета нельзя. Тебе надо ещё переписать sequence numbers. А как только ты это тронешь то получишь разные логические потоки на обоих сторонах своего драйвера. Т.е. что бы это работало тебе в драйвере надо пересчитывать sequence+ack в обоих направлениях...

    P.S. посмотри sequence number tracking в Wireshark.
     
  3. amn

    amn New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2009
    Сообщения:
    12
    В том то и дело, что sequence номера идут правильно, но не отправляется подтверждение о приеме данных с клиента, т. е. идет постоянная перепосылка пакета с данными.

    PS: смотрел номера в wireshark на клиенте.
     
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Что значит правильно?

    Опиши точно что ты делаешь с data пакетом, что ожидаешь увидить в ack, и что будешь с ним делать.
     
  5. amn

    amn New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2009
    Сообщения:
    12
    Устанавливается соединение клиент(К)-сервер(С).
    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)
     
  6. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Что-то ты кривовато описал 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 :)