38 lines
1.1 KiB
Text
38 lines
1.1 KiB
Text
@startuml
|
||
title accept() — принятие TCP-соединения
|
||
|
||
participant "Client" as C
|
||
participant "OS Kernel" as K
|
||
participant "Server" as S
|
||
|
||
== Подготовка сервера ==
|
||
S -> K: socket()
|
||
S -> K: bind()
|
||
S -> K: listen()\n(создаёт очередь входящих соединений)
|
||
|
||
== Входящее соединение ==
|
||
C -> K: connect()
|
||
K -> K: TCP 3-way handshake\n(SYN → SYN-ACK → ACK)
|
||
K -> K: Помещает соединение\nв очередь (backlog)
|
||
|
||
note right of K
|
||
Соединение завершено на уровне ОС,
|
||
сервер ещё не знает об этом
|
||
end note
|
||
|
||
== Принятие соединения ==
|
||
S -> K: accept()\n(блокируется, если очередь пуста)
|
||
K --> S: возвращает новый fd\n(connected socket)
|
||
|
||
note right of S
|
||
Оригинальный listening socket
|
||
продолжает принимать новые
|
||
соединения
|
||
end note
|
||
|
||
== Обмен данными ==
|
||
S <-> C: read() / write()\nчерез новый fd
|
||
|
||
S -> K: close(connected_fd)
|
||
|
||
@enduml
|