소켓과 포트

위키백과에서 소켓이란 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이라고 소개한다.

어떤 컴퓨터의 소켓과 다른 컴퓨터의 소켓 간의 통신이 연결되어 데이터를 전송할 수 있다는 뜻인데, 이 설명만으로는 조금 아쉬웠다.

OS에서는 커널의 구성요소들을 유저 프로세스에서 접근할 수 있도록 파일의 형태로 추상화시킨다.

커널 영역은 각종 장치들에 명령을 내리거나 시스템의 자원을 관리하는 등, 사용자 영역에서는 접근할 수 없는 다양한 작업들을 수행할 수 있다.

그러나 사용자 역시 이러한 장치들에 접근해야할 일이 생기는데, 사용자들을 위해 컴퓨터의 자원들을 추상화시켜서 제공하는 것이다.

리눅스에서는 모든 하드웨어 장치들을 사용자들 입장에서 일반적인 파일로 보이게끔 만들어놓고, 파일을 조작하는데 사용하는 일반적인 시스템콜을 활용하여 해당 장치들을 다룰 수 있게 한다.

이 때, 네트워크와 관련된 장치들을 추상화시킨 파일을 소켓이라고 부른다.

즉 TCP/IP 소켓의 경우, 커널 영역의 네트워크 요소를 유저모드 프로세스가 접근할 수 있도록 파일 형식으로 추상화시켰다는 뜻이다.

프로그래머들은 유저 모드의 네트워크 프로그램을 짜면서 실질적으로는 커널 영역에 존재하는 네트워크 장치를 컨트롤해야 하는데, 이 때의 인터페이스가 소켓이다.

그렇기 때문에 소켓은 파일처럼 취급되며 파일 디스크립터를 하나 할당받고, 파일을 읽거나 쓰는 등의 시스템 콜을 사용하여 다루는 것이다.


일반적으로 웹브라우저 등을 통해 인터넷을 사용하는데, 만약 브라우저를 두개 열어서 따로 인터넷에 접속하는 상황이라고 해보자.

이 때 두 웹브라우저는 따로 실행되었기 때문에 서로 다른 프로세스로 올라왔고, 각자 인터넷 상의 무언가와 통신하기위해 소켓을 생성하고 연결할 것이다.

커널에서는 이러한 소켓들을 구분해서 데이터를 넘겨줘야하는데, 이를 위해 포트를 할당한다.

소켓을 생성할 때 포트번호가 붙음으로써, 패킷을 전송받는 과정에서 4계층에서 운영체제가 어떤 프로세스에게 해당 패킷을 보내줄지 결정할 수 있게 된다.

TCP/IP 포트번호는 16비트를 사용하므로 0 에서 65535 까지 총 2^16가지를 사용할 수 있지만, 0번 포트는 포트 정보가 사라지거나 ICMP 처럼 포트 개념이 없는 프로토콜에 사용되기 때문에, 따로 사용할 수 없다.