일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 인터럽트
- mips
- mutex
- 가상 메모리
- ALU
- 스레드
- PYTHON
- 기아 상태
- 추상화
- BOJ
- 동기화
- 부동소수점
- 컴퓨터구조
- 우선순위
- 교착상태
- 알고리즘
- 백준
- 페이징
- 페이지 부재율
- Algorithm
- 트랩
- concurrency
- 운영체제
- 단편화
- 세마포어
- 프로세스
- fork()
- 스케줄링
- Oracle
- 페이지 대치
- Today
- Total
봉황대 in CS
[컴퓨터 네트워크] 소켓(socket)과 포트(port)의 관계 본문
[컴퓨터 네트워크] 소켓(socket)과 포트(port)의 관계
등 긁는 봉황대 2023. 4. 22. 14:14* 본 글은 '컴퓨터 네트워킹: 하향식 접근 (Computer Networking: A Top-Down Approach) 8th edition'의 내용과 2023학년도 1학기에 수강한 '컴퓨터 네트워크' 과목 강의 내용을 함께 정리하여 작성하였습니다.
현재 수강하고 있는 '컴퓨터 네트워크' 강의에서 소켓에 대한 교수님의 설명을 듣고, 소켓과 포트의 관계에 대해서 머리가 빙글 뱅글 돌게 되었다.
지난 학기에 '네트워크 프로그래밍' 과목을 먼저 수강한.. 어쩌다 보니 선수 과목들을 역순으로 듣고 있는 나는(다들 엇학기는 하지 마세요) 소켓과 포트에 대한 어느 정도의 기본 지식이 있었지만, 그 개념들이 다 꼬이게 되었다.
그래서 중간고사 이전에 관련 내용들을 찾아보고 다시 정리하였고, 중간고사가 끝난 이 시점에 다시 한번 블로그에 정리하여 남겨보고자 한다.
강의 내용
Socket
process sends/receives messages to/from its socket
프로세스는 소켓(socket)을 통해 네트워크로 메시지를 보내고 받는다.
물리적으로(physically) 종단 간 연결되어 있는 곳은 Physical layer 밖에 없다.
상대방과 논리적으로(logically) 연결되어 있는 최상단 layer는 Transport layer이다.
즉, Application layer가 하는 일은 단순히, 소켓(socket)이라는 문을 통해
자신의 프로세스(process)에서의 message를 Transport layer로 전송해 주는 것 밖에 없다.
- socket analogous to door
- Application은 상대방이 누구인지를 전혀 모르기 때문에 Transport infrastructure에 의지한다.
정리하자면, 소켓은 Application layer와 Transport layer가 메시지를 주고받는 통로를 말한다.
- sending process shoves message out door
- sending process relies on transport infrastructure on other side of door
- to deliver message to socket at receiving process
교수님 설명
교수님께서는 아래의 예시를 통해 소켓과 포트에 대해서 설명해 주셨다.
'집'이라는 커다란 program이 있다. 여기에는 여러 종류의 '문'이 있다.
- 현관문 : 사람이 다니는 문
- 쪽문 : 강아지가 다니는 문
- 택배문 : 택배를 받는 문
- 창문 : 신발을 던지는(?!) 문
강아지가 쪽문으로 나가서 마당으로 나간다고 하면 강아지가 message가 되는 것이다.
그리고 집주인이 친구네 집에 간다고 하면 집주인이 message가 되어서 수신 프로세스로 가는 것이다. 이때 집주인은 현관문을 통해서 나갈 것이다.
message가 이동하려면 어느 문을 통과해야 하는가?
→ 집주인은 현관문을, 강아지는 쪽문을, 택배는 택배문을, 신발은 창문을 통해서 나가야 한다.
네트워크 측면에서는 이 문들을 소켓(socket)이라고 부른다.
즉, 소켓은 Transport layer의 서비스를 활용하기 위한 Application layer의 interface이다.
→ 집주인은 현관문이라는 interface를, 강아지는 쪽문이라는 interface를 사용한다.
Application은 'message가 어느 문으로 나가고 들어가야 하는가?'만 신경 쓰면 된다.
집주인이 친구네 집으로 들어갈 때 쪽문으로 기어서 들어가면 안 되는 것처럼, 해당 message에게 정해진 문으로만 왔다 갔다 해야 하기 때문이다.

집에는 그의 위치를 지칭하는 주소가 있다. (= IP 주소)
하지만 집에는 현관문, 쪽문 등 여러 종류의 문들이 있기 때문에 어느 집의 어느 문에 도달해야 하는지를 정확히 알려주어야 한다.
따라서 IP 주소와 포트 번호는 항상 쌍으로 다녀야 하며, 이것들이 Application layer의 identifier이다.
의문
교수님의 설명을 들은 후, 내가 그동안 쌓아놓았던 얄팍한 지식들이 총집합되어 소켓과 포트의 상관관계에 대한 의문이 들게 되었다.
수업을 들었을 당시에 교수님의 소켓에 대한 비유를 '문들을 통틀어서 소켓이라고 부른다'라고 잘못 이해했었고,
각 문들을 포트라고 생각하게 되었다.
네트워크 프로그래밍 과목에서의 기억을 떠올렸을 때, 소켓 선언 시 hostname과 포트 번호를 인자로 반드시 주어야 했다.
(아래 사진은 해당 필기 내용)

따라서 나는 소켓과 포트 번호는 1:1 관계인 줄 알았다.
그리고 줄곧, 네트워크 프로그래밍에서의 과제들처럼 한 프로그램 내에서 한 개의 소켓만을 선언하는 것만을 생각하고 있었다.
그러다가 이전 앱 런칭 프로젝트에서 dev 서버와 prod 서버를 나누어서 운영했던 것이 기억났다.
application.yml 파일에서 각 서버에 대하여 포트 번호를 다르게 선언하였다. (아래 코드는 application.yml의 일부분)
spring:
config:
activate:
on-profile: "devPort"
server:
port: 9000
---
spring:
config:
activate:
on-profile: "prodPort"
server:
port: 9001
위에서 말했던 것처럼 문들을 통틀어서 소켓이라고 부르는 것으로 잘못 이해했기에
그렇다면 한 소켓에 포트가 여러 개 열리게 되는 것인지에 대한 의문이 생기게 되었고, 무언가 이상한 것 같아서 이 내용에 대해 찾아보게 되었다.
정답은 '한 포트에 여러 개의 소켓을 할당할 수 있다'였다.
즉, 앱 런칭 프로젝트에서 내가 선언했던 두 가지의 포트에 대해서 소켓이 각각 생성된 것이었다.
그리고 교수님의 설명은 '각각의 문들을 소켓이라고 부르는 것이고, 각 문들에는 포트 번호가 존재한다'라는 의미였다.
지금 이 글을 작성하면서 다시 생각해 보니 너무나도 당연한 것인데, 그땐 왜 그렇게 헷갈렸는지 모르겠다.
소켓과 포트의 관계
하나의 프로세스는 같은 protocol, 같은 IP address, 같은 port number를 가지는 수만 개의 소켓을 가질 수 있다.
이 덕분에 하나의 프로세스는 하나의 포트 만으로도 다른 여러 호스트의 요청을 처리할 수 있다.
즉, 서버의 경우 하나의 포트 만이 할당되어도, 해당 포트에 대한 여러 개의 소켓을 동시에 열 수 있기 때문에 수백만 이상이 되는 동시 접속자들도 감당할 수 있는 것이다.
IP address, port number, protocol로 소켓을 정의할 수 있지만, 이것이 소켓을 유일하게 식별하지는 않는다. (≈ 동명이인)
정리
Socket
소켓은 Application layer와 Transport layer가 메시지를 주고받는 통로이다.
따라서 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 데이터를 내보내거나,
소켓으로부터 데이터를 읽어 들여야 한다.
소켓의 정의에 필요한 요소 3가지
- Transport layer protocol (TCP or UDP)
- IP address
- port number
Addressing process
한 호스트(host) 상에서 수행되고 있는 프로세스가 다른 호스트에서 수행되고 있는 프로세스로 패킷(packet)을 보내기 위해서는
수신 프로세스의 주소를 갖고 있을 필요가 있다.
- to receive messages, process must have identifier
- host device has unique 32-bit IP address
- 인터넷에서 호스트는 32 비트로 구성된 IP 주소로 식별된다.
Port number
Q : does IP address of host on which process runs suffice for identifying the process?
A : no, many processes can be running on same host
→ identifier includes both IP address and port numbers associated with process on host
한 호스트에서 많은 프로세스가 동시에 실행되고 있을 수 있기 때문에 패킷이 IP 주소에 대한 정보만 가지고 있다면 어느 프로세스에 해당 메시지를 전달해야 할지를 알 수 없다. 즉, 호스트 내의 수신 프로세스가 누구인지에 대한 정보도 있어야 한다는 것이다.
따라서 수신 프로세스와 message를 제대로 주고받으려면 패킷은 (1) IP 주소와
(2) 호스트 내의 수신 프로세스를 명시하는 식별자인 포트 번호(port number)에 대한 정보를 전부 가지고 있어야 한다.
- 호스트에 대한 지칭 → IP 주소
- 소켓에 대한 지칭 → 포트 번호
e.g., to send HTTP message to gaia.cs.umass.edu webserver
- IP address : 128.119.2242.12
- port number : 80 (HTTP server)
포트 번호는 호스트가 네트워크 상에서 통신하기 위해 내부적으로 할당받아야 하는 고유한 숫자이다.
(네트워크 서비스나 특정 프로세스를 식별하는 논리 단위)
이는 한 호스트 내에서 네트워크 통신을 하고 있는 프로세스를 식별하기 위해 사용되는 값이므로,
기본적으로는 같은 호스트 내에서 서로 다른 프로세스가 같은 포트 번호를 가질 수 없다.
참고
컴퓨터 네트워킹: 하향식 접근 (제8판) - 2.1 네트워크 애플리케이션의 원리
컴퓨터 네트워킹: 하향식 접근 (제8판) - 3.2 다중화와 역다중화