В чем разница между ConnectionSuccess и «ConnectionCreated» в Socket?

Я видел исходный код реализации класса Socket в NS-3 и видел две функции-члена:

  /**
   * \brief Notify through the callback (if set) that the connection has been
   *        established.
   */
  void NotifyConnectionSucceeded (void);

а также

  /**
   * \brief Notify through the callback (if set) that a new connection has been
   *        created.
   * \param socket The socket receiving the new connection.
   * \param from The address of the node initiating the connection.
   */
  void NotifyNewConnectionCreated (Ptr<Socket> socket, const Address &from);

Так в чем же основное различие между этими двумя функциями? и есть ли разница между «ConnectionSucceed» и «ConnectionCreated»?


person Tri    schedule 02.05.2020    source источник
comment
Бегло взглянув на документацию, я думаю, что NotifyConnectionSucceeded для исходящих соединений, а NotifyNewConnectionCreated для входящих. Но я могу ошибаться.   -  person Paul Sanders    schedule 02.05.2020


Ответы (1)


Из документации модели ns-3 TCP:

NotifyConnectionSucceeded: SetConnectCallback, 1-й аргумент

Вызывается в состоянии SYN_SENT перед переходом в состояние ESTABLISHED. Другими словами, мы отправили SYN и получили SYN-ACK: сокет подготавливает порядковые номера, отправляет ACK для SYN-ACK, пытается отправить больше данных (в другом сегменте), а затем вызывает этот обратный вызов. . После этого обратного вызова он вызывает обратный вызов NotifySend.

NotifyNewConnectionCreated: SetAcceptCallback, 2-й аргумент

Вызывается, когда из SYN_RCVD сокет переходит в состояние ESTABLISHED, а также после настройки контроля перегрузки, порядковых номеров и обработки входящего ACK. Если в буфере есть место, NotifySend вызывается вскоре после этого обратного вызова. Указатель сокета, переданный с помощью этого обратного вызова, является вновь созданным сокетом после функции Fork().

Итак, то, что говорит @Paul Sanders, по сути правильно: NotifyConnectionSucceeded вызывается, когда TcpSocket, который инициировал соединение (т.е. отправил SYN), получает SYN + ACK. С другой стороны, NotifyNewConnectionCreated вызывается, когда TcpSocket, отправивший SYN+ACK, получает ACK, завершающий трехэтапное рукопожатие. Посмотрите tcp-socket-base.cc, чтобы увидеть, как именно используются эти методы.

Вышеприведенное относится к TCP, и, как вы правильно заметили, эти методы принадлежат Socket. Другие типы сокетов будут использовать эти методы по-другому. Например, UdpSockets используют NotifyConnectionSucceeded, но не поддерживают NotifyNewConnectionCreated.

person Sagar    schedule 23.06.2020