소켓 이론 2/3 · 연결 방향
아웃바운드는
연결을 시작한 방향입니다.
집이나 회사 안의 프로그램이 바깥 서버로 연결을 먼저 엽니다. 한 번 성립한 통로에서는 양쪽 모두 데이터를 보낼 수 있습니다. 연결 방향과 데이터 방향을 분리해서 확인하는 이론 랩입니다.
그 통로는 양방향 ⇄outbound = 연결 시작 방향
두 방향을 따로 보세요
연결 방향과 데이터 방향은 어떻게 다를까요?
읽는 순서① 상황 선택→② 실험 시작→③ 화살표 방향과 ‘인바운드 포트 닫힘’ 확인
- 1안에서 연결
- 2세션 성립
- 3서버가 전송
- 4안쪽이 응답
- 5방향 구분
① 연결 만들기: 안쪽 PC → 바깥 서버② 연결된 뒤: 데이터 ← · 데이터 →
지금 상태
메시지 기록
실험을 시작하면 연결과 데이터 흐름이 한 줄씩 쌓여요.
첫 시나리오는 안쪽에서 연결한 뒤 데이터가 양방향으로 오가는 모습을 보여 줍니다. 두 번째에서는 바깥의 새 연결과 이미 열린 세션을 비교합니다.
원리 세 가지만
아웃바운드 소켓이 하는 일
안쪽 PC의 클라이언트 프로그램이 WSS 443 같은 허용된 바깥 경로를 사용합니다. PC마다 공개 포트를 만들 필요가 없습니다.
outbound는 연결을 누가 시작했는지의 말입니다. 연결 뒤에는 서버도 같은 TCP/WebSocket 세션으로 데이터를 보낼 수 있습니다.
ACK·재시도·중복 제거·상태 복구는 아웃바운드 연결 위에 별도로 만드는 응용 규칙입니다.
원격 작업 말고도
같은 연결 패턴을 쓰는 곳
진단 수집, 배포 보조, 백업 실행
장비 지표, 로그, heartbeat
대시보드 갱신, 작업 진행률
설정 동기화, 승인된 업데이트
이론과 응용의 경계
이 편은 통로가 생기는 원리까지만 다룹니다.
통로 위의 메시지를 어떻게 보장하고 복구할지는 뒤의 소켓 응용 5단계에서 각각 실험합니다.
- 2/3이론 · 연결 방향connect 시작점과 양방향 세션
- 1/5응용 · 전달 보장ACK · 재시도 · 메시지 ID
- 2/5응용 · 흐름 제어backpressure · 청크 이어받기
- 3~5응용 · 복구와 확장상태 · 서버 · 지연 대응
이 데모에 대하여
연결을 건 방향과 데이터가 흐르는 방향을 분리합니다
방화벽 안쪽의 장비를 밖에서 제어해야 할 때 흔히 하는 오해가, 밖에서 안으로 데이터를 보내려면 안쪽으로 들어오는 연결을 열어야 한다는 것입니다. 이 화면은 그 둘이 다른 이야기라는 점을 두 시나리오로 비교합니다. 안쪽에서 밖으로 연결을 한 번 걸어 두면, 그 연결 위로는 양쪽 다 먼저 말을 걸 수 있습니다.
- ‘밖에서 직접 연결’로 시작해 요청이 어디서 막히는지 봅니다.
- 막힌 시점에 안쪽 장비가 그 사실을 아는지 확인합니다.
- ‘안에서 먼저 연결’로 바꿔 연결이 세워지는 단계를 따라갑니다.
- 연결 직후 장비가 자기 신원을 밝히는 단계를 확인합니다.
- 서버 쪽에서 먼저 보내는 메시지가 도착하는지 봅니다.
- 장비 쪽에서 보내는 메시지도 같은 연결을 쓰는지 확인합니다.
- 화면 위쪽의 안쪽 포트 열림 표시가 끝까지 꺼져 있는지 봅니다.
- 두 시나리오에서 주고받은 메시지 수를 비교해 봅니다.
- 연결 상태가 오프라인에서 온라인으로 바뀌는 지점을 확인합니다.
- 암호화 표시가 어느 단계에서 켜지는지 봅니다.
- 장비 식별자가 화면 어디에 표시되는지 찾아봅니다.
이 구조가 성립하는 이유
01
연결 방향은 처음 한 번만 정해집니다.
누가 먼저 말을 걸었는지는 연결을 세울 때의 문제이고, 일단 세워진 뒤에는 양쪽이 대등하게 주고받습니다. 화면에서 서버가 먼저 보낸 메시지와 장비가 먼저 보낸 메시지를 각각 세어 표시하는 것이 이 점을 보여주기 위한 것입니다. 연결을 건 쪽만 말할 수 있다면 이 구조 자체가 성립하지 않습니다.
02
나가는 연결은 대개 막혀 있지 않습니다.
회사나 가정의 방화벽은 보통 밖에서 안으로 들어오는 연결을 막고 안에서 밖으로 나가는 연결은 허용합니다. 그래서 안쪽에서 먼저 걸면 아무 설정 없이도 통로가 생깁니다. 밖에서 안으로 들어오려면 문을 따로 열어야 하는데, 그 문은 전 세계에 열리는 것이라 위험이 함께 늘어납니다.
03
포트를 열지 않는다는 것이 핵심입니다.
성공하는 시나리오 내내 안쪽 포트 열림 표시는 꺼진 채로 있습니다. 접속 가능한 지점을 새로 만들지 않았다는 뜻이고, 밖에서 그 장비를 직접 찾아갈 방법은 여전히 없습니다. 관리 통로를 만들면서도 공격받을 수 있는 면을 늘리지 않는다는 것이 이 방식이 널리 쓰이는 이유입니다.
04
연결한 뒤에 누구인지 밝힙니다.
연결이 세워진 직후에 장비가 자기 식별자를 보내는 단계가 따로 있습니다. 서버 입장에서는 여러 장비가 각자 연결을 걸어 오므로, 어느 연결이 어느 장비인지 알아야 명령을 제대로 보낼 수 있습니다. 연결 자체가 신원을 알려주지 않는다는 점이 안쪽에서 거는 방식의 대가입니다.
05
실패도 상태로 표현했습니다.
막히는 시나리오에서 화면은 오류 문구만 띄우지 않고 요청이 어디까지 갔다가 막혔는지를 위치로 보여줍니다. 그리고 그 시점에 안쪽 장비는 아무것도 모르는 상태로 남습니다. 밖에서 접속이 안 될 때 안쪽 로그에 흔적이 없는 이유가 이것이고, 로그가 비어 있다는 사실 자체가 단서가 됩니다.
06
보호 계층은 켜진 것으로 둡니다.
연결을 세우는 단계에서 암호화 표시가 함께 켜집니다. 관리용 통로를 평문으로 여는 경우는 없어야 하므로 기본값을 그렇게 잡았습니다. 다만 이 화면은 그 절차 자체를 보여주지는 않고 상태 표시로만 다루며, 그 과정은 다른 편에서 단계별로 확인할 수 있습니다.
07
예시 주소는 문서용을 씁니다.
화면에 나오는 서버 주소와 장비 이름은 예제용으로 비워 둔 도메인과 임의의 식별자입니다. 실제로 존재하는 주소를 적으면 그쪽으로 접속을 시도하는 일이 생길 수 있어서, 문서에서 쓰라고 지정해 둔 이름을 골랐습니다.
08
끊기면 안쪽에서 다시 걸어야 합니다.
이 구조에서 연결을 세울 수 있는 것은 언제나 안쪽 장비뿐입니다. 그래서 연결이 끊기면 서버는 기다리는 것 말고 할 수 있는 일이 없고, 장비 쪽이 다시 걸어 줘야 통로가 복구됩니다. 장비가 멈췄거나 재연결 로직이 없으면 밖에서는 손쓸 방법이 전혀 없다는 뜻이라, 재연결을 얼마나 견고하게 만들었는지가 이 방식의 신뢰성을 결정합니다.
09
서버가 연결을 들고 있어야 합니다.
장비가 걸어 온 연결은 특정 서버 한 대와 맺어집니다. 그래서 서버를 여러 대 두면 어느 서버가 어느 장비를 들고 있는지 찾는 문제가 새로 생기고, 명령을 보내려는 쪽이 그 정보를 알아야 합니다. 이 화면은 서버가 한 대인 상황을 전제로 하며, 여러 대일 때의 연결 위치 문제는 서버 확장을 다루는 편과 같은 종류의 문제입니다.
통로를 만드는 방식만 다룹니다.
브라우저는 어떤 서버에도 접속하지 않으며 모든 단계는 미리 만들어 둔 것입니다. 이 화면이 보여주는 것은 연결 방향과 데이터 방향이 다르다는 구조 하나이고, 실제 운영에서 필요한 것들은 빠져 있습니다. 연결이 끊겼을 때 다시 붙는 방식과 그 간격 조절, 장비가 살아 있는지 확인하는 신호, 어느 장비에 어떤 권한을 줄지 정하는 인증과 인가, 서버가 여러 대일 때 장비의 연결을 어느 서버가 들고 있는지 찾는 문제, 한 서버에 장비 수천 대가 붙었을 때의 자원 관리가 모두 별도 주제입니다. 또한 안쪽에서 나가는 연결을 허용하는 환경을 전제로 하므로, 나가는 방향까지 엄격히 통제하는 망에서는 이 방식도 그대로 쓸 수 없습니다. 그런 환경에서는 허용된 목적지 목록에 제어 서버를 등록하는 절차가 먼저 필요하고, 그 협의 자체가 기술적인 문제가 아니라 조직의 문제가 됩니다. 그리고 통로를 하나 열어 두면 그 통로로 무엇을 할 수 있는지가 곧 권한의 범위가 되므로, 장비가 받을 수 있는 명령의 종류를 처음부터 좁게 정해 두는 편이 안전합니다.
참고 자료RFC 6455 — WebSocket 프로토콜 ↗MDN — WebSocket API ↗RFC 3022 — 주소 변환(NAT) 동작 ↗
실험을 마쳤다면