Hi, All!
Волею судеб приходится разбираться с протоколами RTP/RTSP. Для экспериментов использую VLC Player, трафик со стороны клиента смотрю снифером. И понимаю, что некоторых вещей я не понимаю. Буду крайне признателен разъяснению на пальцах некоторых вопросов.
1) Я вижу, например, такую последовательность RTSP
SETUP rtsp://xxx.xxx/xxx.xxx:554/h264/ch3/main/av_stream/trackID=1 RTSP/1.0
CSeq: 5
Authorization: Basic YWRtaW46MTIzNDU=
User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)
Transport: RTP/AVP;unicast;client_port=56842-56843
RTSP/1.0 200 OK
Session: 1471912436
Transport: RTP/AVP;unicast;client_port=6970-6971;server_port=62376-62377;ssrc=57bb99f4
CSeq: 5
Клиент говорит серверу на каких портах он ждет данные, а сервер отвечает с каких портов он будет передавать. Но что означает client_port=6970-6971 в ответе сервера? При этом снифером я вижу, что со стороны клиента в обмене участвуют порты 56842, 56843, а порты 6970, 6971 не вижу вообще. То, что они не совпадают с клиентскими, значит ли, что сервер сидит за NAT'ом, и это результат трансляции? Зачем они клиенту?
2) Может ли работать RTP по UDP, если и сервер, и клиент сидят за NAT'ами? Предположим, что на серверной стороне прописан порт форвардинг 554 порта на нужный адрес, без этого вообще ничего не получится, но как быть с RTP портами, они же динамические? Если NAT только с одной стороны, то вроде бы я понимаю как, а вот если с двух — не могу понять как UDP пакеты пробивают себе дорогу. В моем случае, я то точно сижу за NAT, и видеоисточник, похоже, тоже. Читал про STUN, ни черта не понял, а кроме того, для этого нужен внешний сервер; можно предположить, что клиентский комп знает про это, но откуда видеокамера, маленькая тупая железная муму, может знать про STUN сервер?
3) В случае, если клиенту и видеоисточнику не удается снюхаться по UDP, видеопоток идет по TCP, иногда для этого открывается отдельное соединение, а иногда прямо в том же, на 554 порту. Правильно ли я понимаю, что в этом случае все преимущества RTP — некоторое снижение трафика, толерантность к затыкам на неустойчивом и/или узком канале, возможность потери и отбрасывания части фреймов, синхронизация в реальном времени — все это идет к чертовой бабушке?