소켓
클라이언트와 서버와의 데이터 송수신 과정에 있어서, 데이터가 오고 가는 파이프와 같은 통로가 있다.
이러한 통로의 양측 출입구를 소켓이라하며, 해당 소켓을 만드는 것으로부터 데이터 통신은 시작되며 다음과 같은 순서로 진행된다.
- 소켓을 만든다(소켓 작성 단계)
- 서버측의 소켓에 파이프를 연결한다(접속 단계)
- 데이터를 송수신한다(송수신 단계)
- 파이프를 분리하고 소켓을 말소한다(연결 끊기 단계)
위 네 가지 단계는 전부 OS 내부 프로토콜 스택에 의해서 실행된다. 다시 말해 브라우저 같은 어플리케이션이 의뢰하는 동작의 순서이다.
1. 소켓 작성 단계
클라이언트의 소켓을 만드는 과정은 소켓 라이브러리의 socket이라는 프로그램 부품을 호출하여 진행된다.
과정을 간략하게 설명하면 socket을 호출하고 난 뒤 socket 내부에 제어권을 넘겨 소켓을 만들고 다시 돌려받는 식으로 진행된다.
소켓이 생성되고 난 뒤 어플리케이션은 디스크립터를 받아 메모리에 기록한다.
디스크립터란 소켓을 식별하기 위해 사용하는 번호표 같은 것으로, 컴퓨터의 경우 여러 네트워크 데이터 송수신 과정이 동시에
진행되기 때문에 여러 소켓이 한 대의 컴퓨터에서 사용되는 경우가 있기 때문에 필요하다.
2. 접속 단계
생성된 소켓을 서버 측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다. 애플리케이션은 소켓 라이브러리의 connect라는
프로그램 부품을 호출하여 이 과정을 의뢰한다. connect 호출을 위해 디스크립터, 서버의 IP 주소, 포트 번호 3개의 값이 필요하다.
우선 디스크립터는 앞서 소켓을 작성하면서 받은 디스크립터를 말한다. 해당 디스크립터를 통해 서버 측 소켓과 연결할
소켓의 정보를 확인한다. 어느 서버로 연결 할 지 알아야하기 때문에 서버의 IP 주소 또한 필요하다.
IP 주소는 네트워크에서 PC 각각이 갖추는 고유한 주소이지만, 한 대의 컴퓨터는 여러 개의 소켓을 가질 수 있다고 앞서 언급한 바 있다.
그렇기 때문에 어느 컴퓨터의 어느 소켓에 연결할 지를 정확히 알아야하고, 어느 컴퓨터인지에 대한 정보는 IP 주소를 통해,
어느 소켓에 연결할 지에 대한 정보는 포트 번호를 통해 확인하게 된다.
그런데 디스크립터가 소켓을 구분하기 위해 사용한다 했는데, 서버의 소켓을 확인하기 위해서는 포트 번호를 사용한다.
디스크립터는 소켓을 만들도록 의뢰한 어플리케이션에게 전달해주는 값일 뿐, 접속 상대에게 건내주는 값은 아니기 때문이다.
어느 포트 번호를 전달해야하는 지는 DNS와는 달리 쉽게 찾을 수 있다. 서버의 포트번호는 미리 지정된 값을 사용하는 규칙이 있기 때문이다.
3. 송수신 단계
소켓이 준비되고 나면, 애플리케이션은 송수신을 준비하는 단계에 접어드게 된다.
우선 메모리에 송신할 데이터를 준비한다. HTTP 리퀘스트 메시지가 송신할 데이터가 된다.
프로토콜 스택을 통해 write 부품을 호출하여 디스크립터와 송신 데이터를 지정하고, 서버로 데이터를 보내게 된다.
반대로 서버로부터 데이터를 수신하는 과정에서는 .소켓 라이브러리의 read 부품을 이용하여 응답 메시지를 수신한다.
이 때 수신되는 데이터는 수신 버퍼라 불리는 메모리 영역에 저장되고, 데이터가 전부 저장되면 어플리케이션에 전달한다.
4. 연결 끊기 단계
데이터 송수신 과정이 끝나면 close 부품을 통해 연결이 끊어지게 된다.
웹 서버에서 클라이언트로 응답 메시지 송신이 완료되면, 웹 서버 측에서 먼저 연결 끊기 동작을 실행한다.
이 후 클라이언트 측에 전달되어 클라이언트의 소켓도 연결 끊기 과정으로 들어간다.
데이터 송수신 과정에서 read의 결과 값으로 연결이 끊어졌다는 사실을 어플리케이션에 전달하고,
어플리케이션은 close를 호출하여 연결을 끊는 단계에 들어간다.
프로토콜 스택
프로토콜 스택의 내부는 역할에 따라 구분되어 있다.
우선 네트워크 애플리케이션이 있다. 브라우저, 메일러(메일을 읽고 쓰는 소프트웨어), 웹 서버, 메일 서버 등의
프로그램이 여기에 해당된다.
네트워크 애플리케이션 내부에는 소켓 라이브러리가 있으며, 그 안에 DNS 리졸버가 내장되어 있다.
그리고 OS가 있으며 내부에 프로토콜 스택이 있다. 데이터 송수신을 위해 TCP, UDP 프로토콜을 사용한다.
TCP는 신뢰성이 있고 무결성을 보장하는 상대적으로 느린 데이터 전송 프로토콜이고,UDP는 전송 속도가 빠르지만 데이터의 안정성이 상대적으로 덜 보장되는 전송 프로토콜이다.
또한 IP 프로토콜을 사용하여 패킷 송수신 동작 제어 역할을 한다. 패킷이란 네트워크 통신에서 데이터가 전송되는 단위이다.
IP 내부에는 ICMP와 ARP 프로토콜이 있고, ICMP는 패킷 송수신 시 발생하는 오류 및 제어 메시지를 전달하기 위해,
ARP는 IP 주소에 대응하는 이더넷의 MAC 주소를 조사할 때 사용한다.
프로토콜은 브라우저가 connect라는 소켓 라이브러리 내부 부품을 호출했을때, 소켓을 연결한다.
이 과정에서 프로토콜 스택 내부에서 TCP는 소켓 한 개 분량의 메모리 영역을 미리 확보한다.
확보된 메모리 영역에 내용에 해당하는 제어 정보를 저장한다.
이후 소켓을 나타내는 디스크립터를 애플리케이션에 전달하게 된다.
Today 확인 질문
1. 소켓 라이브러리 connect 로 클라이언트랑 서버를 연결할 때 필요한 정보는 어떤게 있나요?
: 디스크립터, 서버의 IP 주소, 포트 번호가 필요합니다.
2. 서버 소켓에 연결할 때, 디스크립터말고 포트 번호 사용하는 이유가 뭔가요?
: 웹 서버의 포트 번호는 특정 기능에 때라 웹(80번), 메일(25번)과 같이 특정 기능이 정해져 있기 때문에 이에 대한 정보를 클라이언트
측에서도 가지고 있을 수 있어 디스크립터 대신 포트 번호를 사용합니다. 또한, 디스크립터는 소켓을 생성하면서 소켓을 구분하기 위해
소켓을 요청한 브라우저와 같은 어플리케이션에 전달하는 값입니다. 앞서 말했듯 웹 서버의 소켓 번호는 특정되어 있기 때문에
디스크립터 대신 포트 번호를 사용합니다.
References
성공과 실패를 결정하는 1%의 네트워크 원리
'Dev > CS' 카테고리의 다른 글
[네트워크] Day 4 (0) | 2023.11.29 |
---|---|
[네트워크] Day 3 (0) | 2023.11.14 |
[네트워크] Day 1 (0) | 2023.11.08 |
[운영체제] 가상 메모리, 파일 시스템 (1) | 2023.10.31 |
[운영체제] 프로세스 동기화, 교착 상태 (0) | 2023.10.31 |
댓글