콘텐츠로 이동

포트와 소켓은 뭐가 다를까요?

같은 집 주소로 도착한 인터넷 데이터도, 어느 방으로 들어가야 할지 한 번 더 구분해야 해요.

DNS는 어떻게 이름을 IP 주소로 바꿀까요?에서 우리는 google.com 같은 이름이 DNS 를 통해 IP 주소로 바뀐다는 걸 봤어요. 그래서 이제 어느 컴퓨터로 가야 하는지 는 알게 됐죠.

근데요, 여기서 끝이 아니에요.

한 컴퓨터 안에는 브라우저도 있고, 게임도 있고, 메신저도 있잖아요? 그럼 그 컴퓨터에 도착한 데이터는 정확히 어떤 앱이 받아야 하는지 도 알아야겠죠.

바로 그때 등장하는 게 포트(Port)소켓(Socket) 이에요.

이름만 보면 벌써 비슷해서 헷갈릴 것 같죠? 근데요, 일상 비유로 보면 생각보다 금방 감이 와요.


일단 비유로 시작해볼게요

택배를 회사 건물로 보낸다고 상상해볼까요?

  • 건물 주소는 이미 알아요
  • 근데 건물 안에 부서가 여러 개 있어요
  • 3층 개발팀, 5층 회계팀, 7층 고객센터처럼요

이 상태에서 택배 상자에 건물 주소만 적혀 있으면 어떻게 될까요?

건물까진 오겠죠. 근데 그다음은 좀 난감해요.

그래서 보통은 이렇게 적어요.

  1. 건물 주소
  2. 몇 층인지, 몇 호인지
  3. 누구 앞으로 온 건지

인터넷도 완전히 비슷해요.

  • IP 주소는 어느 컴퓨터인지 알려주고
  • 포트 번호는 그 컴퓨터 안의 어느 앱인지 알려줘요
  • 소켓은 그 앱과 실제로 연결된 통신 자리라고 보면 돼요
flowchart LR
    A[🌍 인터넷에서 온 데이터] --> B[🏢 컴퓨터<br/><small>IP 주소로 도착</small>]
    B --> C[🚪 포트 443<br/><small>웹 서버 쪽 문</small>]
    B --> D[🚪 포트 53<br/><small>DNS 쪽 문</small>]
    B --> E[🚪 포트 22<br/><small>원격 접속 쪽 문</small>]

즉, IP 주소가 건물 주소라면 포트는 문 번호나 내선 번호에 가까워요.


포트는 뭘 구분해주는 걸까요?

포트는 한 컴퓨터 안에서 어느 프로그램이 이 데이터를 받아야 하는지 를 구분해주는 번호예요.

부분 비유에서는 실제로는
🏢 건물 주소 어느 건물로 갈지 IP 주소
🚪 문 번호 / 호수 어느 부서, 어느 방인지 포트 번호
👩‍💼 그 방의 담당자 실제로 택배를 받는 사람 앱 / 서비스
☎️ 지금 연결된 통화선 실제 대화가 오가는 선 소켓

예를 들어 이런 식이에요.

  • 웹사이트는 보통 80번 또는 443번 포트를 많이 써요
  • DNS는 보통 53번 포트를 많이 써요
  • SSH 원격 접속은 보통 22번 포트를 많이 써요

여기서 중요한 건 이거예요.

포트는 앱 그 자체가 아니라, 앱이 기다리고 있는 번호표에 가까워요.

그러니까 443이 "웹사이트" 그 자체는 아니고, 웹 서버가 "이 문으로 들어오세요" 하고 열어둔 번호라고 보면 돼요.

flowchart LR
    A[💻 한 대의 컴퓨터] --> B[🌐 웹 서버<br/><small>포트 443</small>]
    A --> C[📚 DNS 서버<br/><small>포트 53</small>]
    A --> D[🛠️ SSH 서버<br/><small>포트 22</small>]

같은 컴퓨터라도 앱마다 서로 다른 포트를 쓰면, 데이터가 섞이지 않고 각자 자기 자리로 들어갈 수 있어요.


그럼 소켓은 또 뭐가 다른 걸까요?

여기서 많이 헷갈려요. 포트랑 소켓이 같은 말 아닌가? 싶거든요.

근데요, 사실은 아니에요.

  • 포트는 "몇 번 문인지"
  • 소켓은 "그 문에 연결된 실제 통신 끝점"

조금 더 쉽게 말하면 이래요.

  • 포트 = 건물의 문 번호
  • 소켓 = 그 문을 통해 지금 실제로 연결된 통화선

예를 들어 브라우저가 어떤 서버에 접속할 때는, 브라우저 쪽에도 자기 포트가 하나 생기고 서버 쪽에도 자기 포트가 있거든요. 그리고 그 둘이 연결되면 양쪽 끝점이 만들어져요. 그걸 소켓이라고 보면 돼요.

sequenceDiagram
    participant 브라우저 as 💻 브라우저<br/>192.168.0.10:51515
    participant 서버 as 🌍 웹 서버<br/>142.250.196.78:443

    브라우저->>서버: HTTPS 요청
    서버-->>브라우저: 응답 데이터

위 그림에서:

  • 192.168.0.10:51515클라이언트 쪽 소켓
  • 142.250.196.78:443서버 쪽 소켓

이라고 이해하면 돼요.

즉, 소켓은 보통 IP 주소 + 포트 번호로 생각하면 감이 와요. 그리고 실제 통신은 클라이언트 소켓 ↔ 서버 소켓 사이에서 벌어져요.

이것만 기억해도 충분해요

포트는 앱을 구분하는 번호, 소켓은 실제 통신이 붙는 끝점이에요.


근데 왜 이런 구분이 필요할까요?

"어차피 IP 주소로 컴퓨터까지 왔는데, 거기서 알아서 처리하면 안 되나?" 싶죠?

근데 한 컴퓨터 안에는 생각보다 여러 앱이 동시에 움직여요. 그래서 이 구분이 꼭 필요해요.

1. 한 컴퓨터에 앱이 여러 개 있으니까요

노트북 한 대만 봐도 브라우저, 메신저, 게임, 업데이트 프로그램이 동시에 인터넷을 쓰잖아요.

만약 포트가 없다면, 컴퓨터는 들어온 데이터를 보고 "이걸 누구한테 줘야 하지?" 하고 멈춰버릴 거예요.

2. 같은 앱도 연결이 여러 개일 수 있어요

브라우저 탭을 여러 개 열어두면, 한 서버와만 이야기하는 게 아니죠. 여러 사이트와 동시에 통신할 수도 있어요.

이때 각각의 연결을 구분하려면 "어느 쪽 누구와 연결된 대화인지" 를 식별해야 해요. 소켓이 그 역할을 해줘요.

3. 돌아오는 답도 정확히 제자리로 보내야 하니까요

서버가 응답을 보낼 때도 그냥 "아까 그 컴퓨터" 정도로 보내면 부족해요. 그 컴퓨터 안의 어느 앱, 어느 연결로 되돌려줘야 하는지 알아야 하거든요.

즉, IP 주소는 "집까지", 포트와 소켓은 "집 안 어디까지"를 책임져요.


그럼 진짜 포트와 소켓은 어떻게 보일까요?

브라우저가 웹사이트 하나에 접속할 때, 아주 단순하게 보면 이런 모습이에요.

출발지 192.168.0.10:51515 ← 내 브라우저 쪽
도착지 142.250.196.78:443 ← 웹 서버 쪽
프로토콜 TCP
GET / HTTP/1.1
Host: example.com

여기서 보면:

  • 142.250.196.78어느 컴퓨터인지
  • 443 은 그 컴퓨터 안에서 웹 서버가 기다리는 문 번호
  • 51515 는 내 컴퓨터가 이번 통신을 위해 잠깐 쓴 임시 포트예요

이 임시 포트가 왜 필요하냐면, 브라우저가 동시에 여러 서버와 통신하더라도 응답을 어느 요청에 돌려줘야 하는지 구분해야 하거든요.

한 가지 헷갈리기 쉬운 점

서버는 보통 잘 알려진 포트 번호를 오래 열어두지만, 클라이언트는 통신할 때마다 잠깐 쓰는 임시 포트를 많이 써요. 그래서 브라우저 쪽 포트 번호는 접속할 때마다 달라질 수 있어요.


자, 정리해볼까요?

오늘 우리가 배운 것

  • IP 주소는 어느 컴퓨터로 갈지 알려줘요.
  • 포트 번호는 그 컴퓨터 안에서 어느 앱이 받을지 구분해줘요.
  • 소켓은 실제 통신이 붙는 끝점이라고 보면 돼요.
  • 한 컴퓨터에 여러 앱과 여러 연결이 동시에 있어도, 포트와 소켓 덕분에 서로 안 헷갈려요.
  • 즉, 인터넷 데이터는 컴퓨터까지는 IP로, 앱까지는 포트와 소켓으로 찾아가요.

어때요? 이제 "IP 주소는 알겠는데, 같은 컴퓨터 안에서는 어떻게 구분하지?" 같은 궁금증은 조금 풀리죠?

우리는 이제 꽤 멀리 왔어요. 패킷이 뭔지에서 시작해서, 길도 찾고, 전달 방식도 보고, 이름도 주소로 바꾸고, 마지막으로 어느 앱으로 들어가는지 까지 봤으니까요.


다음 글 예고

근데 여기서 또 이런 생각이 들지 않으세요?

"브라우저는 443번 문을 두드린 뒤에, 대체 무슨 말을 주고받길래 웹페이지가 뜨는 걸까요?"

다음 글에서는 "HTTP와 HTTPS" 이야기를 해볼게요. 우리가 주소를 찾고, 연결할 앱도 찾았다면, 이제 그 위에서 어떤 규칙으로 대화를 나누는지 볼 차례예요.