kakasoo

[Network] TCP/IP의 데이터를 전기 신호로 만들어 보낸다 (1) 본문

프로그래밍/네트워크

[Network] TCP/IP의 데이터를 전기 신호로 만들어 보낸다 (1)

카카수(kakasoo) 2021. 1. 31. 17:18
반응형

이 글은 성공과 실패를 결정하는 1%의 네트워크 원리를 읽고, 스터디한 결과를 토대로 작성했다.


 

이 장에서는 OS에 내장된 프로토콜 스택이 어떻게 송신을 의뢰하는지에 대해서 설명한다. ( 1장에서 OS에 의뢰한다고 설명했던 것을 더 세세히 분석한다. )

01. 소켓을 작성한다.

1. 프로토콜 스택의 내부 구성

OS에 내장된 네트워크 제어 용 소프트웨어 ( 프로토콜 스택 ) 과 네트워크 용 하드웨어 ( LAN 어댑터 ) 가 브라우저에서 받은 메시지를 서버에 송출하는 동작을 한다.

계층의 최상위에는 애플리케이션 계층이 있다. 여기부터 아래로 향하여 데이터 송수신 등의 일을 의뢰한다.

애플리케이션에는 Socket 라이브러리가 있는데, 다시 이 안에는 리졸버가 내장되어 있다.

애플리케이션 계층 아래는 OS를 나타내며, 프로토콜 스택이 있다. 프로토콜 스택 내에서는 TCP와 UDP 프로토콜을 담당하는 부분이 있고, 그 아래에는 IP 프로토콜을 사용하는 계층이 있다.

TCP와 UDP는 각기 다른 프로토콜로 데이터의 송수신을 담당하며, IP는 패킷 송수신 동작을 제어한다.

데이터를 전송할 때에는 데이터를 작게 나누어 패킷 이라는 형태로 운반하는데, 이 패킷을 통신 상대에게까지 운반하는 것이 IP의 주 역할이다.

다시 IP 안에는 ICMP와 ARP 라는 프로토콜이 있는데, ICMP는 패킷을 운반할 때 발생하는 오류를 통지하거나 제어용 메시지를 통지할 때, ARP는 IP 주소에 대응하는 이더넷 MAC 주소를 조사할 때 쓴다.

IP 아래에 있는 LAN 드라이버는 LAN 어댑터의 하드웨어를 제어한다. 그리고 그 아래에 있는 LAN 어댑터가 실제 송수신 동작, 즉 케이블에 대해 신호를 송수신하는 역할을 한다.

⇒ 정리하자면, OS는 프로토콜 스택과 LAN 어댑터라는, 소프트웨어와 하드웨어로 나뉜다. 하드웨어가 실질적인 데이터 송수신 동작을 한다면, 프로토콜 스택은 내부에서, 각종 프로토콜을 결정짓는 셈.

2. 소켓의 실체는 통신 제어용 제어 정보

프로토콜 스택은 내부에 제어 정보를 기억하는 메모리 영역을 가지고 있으며, 여기에 상대 IP, 포트 번호, 통신 동작의 현 진행 상태 등을 저장해둔다.

제어 정보의 예

프로토콜 스택은 제어 정보를 참조함으로써 동작한다. 예컨대 데이터를 보낼 때에는 소켓에 기록된 IP 주소와 포트번호를 보고 송신한다. 송신을 하면 데이터 도착 응답을 기다린다.

도중에 데이터가 사라지면 응답을 계속 기다려야 하는데, 이런 경우를 대비해서, 소켓에는 응답이 돌아왔는지 여부와 송신 후 경과 시간 등이 기록되어 있다.

⇒ 네트워크 계층을 항상, 아래에서 위로 올라가면서 봤었는데 위에서 아래로 보니까 이해가 더 잘 되는 거 같다. 이게 순서가 더 맞는 듯 하다.

3. Socket을 호출했을 때의 동작

socket이나 connect라는 Socket 라이브러리 함수를 호출했을 때 프로토콜 스택 내부가 어떻게 변하는지에 대해.

  1. socket을 호출하여 소켓을 만들 것을 의뢰하면 프로토콜 스택은 의뢰에 따라 소켓을 생성한다.
    • 이 때 프로토콜 스택은 소켓 1개 분량의 메모리 영역을 확보한다. 여기에 제어 정보를 기록한다.
  2. 소켓이 생성되면 소켓을 나타내는 디스크립터를 애플리케이션에게 알려준다.
  3. 이후 애플리케이션은 해당 소켓을 사용한다. 이로인해 계속해서 통신 상대의 정보를 통지해줄 필요가 사라진다.

의문점

  1. 왜 DNS 서버와 송수신할 때에는 UDP로 통신하는가 ⇒ byte size가 512bite 이내기 때문에 주로 UDP를 사용하고, 이를 초과할 경우 TCP를 사용한다.
  2. 왜 DNS 서버는 계속 가장 가까운 DNS 서버를 거쳐가면서 탐색을 진행하는가?

02. 서버에 접속한다

1. 접속의 의미

소켓을 만들면 브라우저는 connect를 호출한다. 그러면 프로토콜 스택은 자기 쪽의 소켓을 서버 측 소켓에 접속시킨다.

원래, 이더넷이나 통신 회선은 항상 케이블에 연결되어 있어서 언제든지 신호를 보낼 수 있다. 그러나 소켓을 만든다고 그 직후에는, 통신 상대를 알 수 없는 상태이다.

이 때 브라우저는 URL과 포트 번호 80 ( 디폴트 값 )을 통해서 필요한 정보를 아는 상태이다. 따라서 IP와 포트 번호를 프로토콜 스택에 알리는 과정이 필요한데, 이를 접속이라고 한다.

서버 측도 마찬가지라, 어떤 클라언트가 있는지를 모른다. 이 때, 클라이언트 측에서 자신의 IP와 포트 번호를 전달하며 통신을 요구한다. 이 과정도 접속 동작의 역할 중 하나다.

접속의 첫 동작은, 통신 상대와 제어 정보를 주고 받아 소켓에 필요한 정보를 기록하고 데이터 송수신이 가능한 상태로 만드는 것이다.

2. 맨 앞부분에 제어 정보를 기록한 헤더를 배치한다.

제어 정보는 크게 두 가지로 나눈다. 하나는 클라이언트와 서버가 연락을 절충하기 위해 주고받는 제어 정보이다.

이는 접속부터 데이터 송수신, 연결 종료까지 통신 동작 전체에서 필요한 정보를 검토하여 TCP 프로토콜의 사양으로 규정되어 있다. 이를 패킷의 맨 앞부분에 부가한다.

데이터의 송수신이 없는 연결 및 종료 단계에서는 제어 정보만이 패킷에 담긴다.

송신측 : 데이터 송신 동작을 개시합니다. 수신측 : 예, 알겠습니다. 송신측 : 1번 데이터를 보냅니다. 수신측 : 1번 데이터를 받습니다.

다른 제어 정보

위에서 말한 제어 정보가 헤더에 기입하는 제어 정보라면, 다른 하나는 소켓 ( 프로토콜 스택의 메모리 영역 )에 기록되는 정보이다.

여기에는 애플리케이션으로부터 받은 정보, 통신 상대로부터 받은 정보가 수시로 기록되며, 진행 상황을 파악할 수 있게 한다. 곧 소켓의 제어 정보가 프로토콜 스택의 프로그램과 일체화된 셈이다.

의문점

  • 2번의 내용이 전부 의문이다. 두 헤더가 뭐가 다른지 잘 이해하기가 힘들다.

3. 접속 동작의 실제

지금까지 접속에 대해서 배웠으며, 이 동작을 따라간다는 것은 connect를 호출하는 것과 같다.

connect ( descriptor, hostIP, port, ...options )

파라미터에 있는 값들을 통해서, 어떤 소켓이 어떤 호스트, 어떤 포트로 연결되는지를 알 수 있다. 이를 통해 제어 정보를 기록한 헤더를 만든다. ( 송신처와 수신처의 포트번호 )

다음으로 컨트롤 비트인 SYN이라는 비트를 1로 만든다.

이렇게 만든 TCP 헤더는 IP 담당 부분으로 전달한다. IP 담당 부분은 패킷 송신 동작을 실행하여 서버측 IP 담당 부분에게 전달하고, 이는 다시 서버측 TCP 담당 부분에 건넨다.

서버측 TCP는 헤더를 조사하여 기록되어 있는 수신처 포트 번호에 해당하는 소켓을 찾고, 필요한 정보를 기록해 접속 동작이 진행중인 것으로 고친다.

3 way handshake에 대한 설명.

QUESTION

브라우저에 URL을 입력하고 Enter를 눌렀을 때, 일어나는 일을 최대한 길게 설명하라.

https://hojong.me/tcp-ip-dns

DNS 서버가 계층적인 게 맞는가? - 문XX

URL 가장 앞에 있는 게 프로토콜이라고 할 수 있는가? - 김XX

  • 예외적으로 FTP가 있다. 로컬에서만 동작하여 프로토콜이라 할 수 없다.

AWS에서 어떤 식으로 도메인을 IP에 등록 (할당)해주는가? - 김XX

반응형