ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 02 TCP/IP의 데이터를 전기 신호로 만들어 보낸다
    Study/성공과 실패를 결정하는 1%의 네트워크 원리 2022. 1. 25. 20:33

    이번 장에서는 브라우저가 HTTP 요청을 하기 위해 소켓을 작성하고 서버에 접속하는 과정과 TCP/IP, 이더넷을 통해 데이터를 송수신 하는 과정에 대해 알아봅니다.

    1. 소켓을 작성한다

    브라우저에서 서버에 접속하려면 OS의 프로토콜 스택에 요청해야 하는데 이 때 소켓을 사용합니다. 소켓은 소켓 라이브러리를 이용해서 생성할 수 있습니다.


    소켓은 내부적으로 프로세스 통신을 제어하기 위한 제어 정보들을 메모리에 저장하고, 이 정보들을 이용해서 프로토콜 스택에 송수신을 요청합니다.

    2. 서버에 접속한다

    HTTP 요청을 위해 소켓을 생성했으면 그 다음은 서버에 접속을 해야합니다. 서버에 접속하려면 서버의 IP와 서버에 있는 애플리케이션의 포트를 알아야 합니다. 이는 서버 URL에서 구할 수 있습니다. DNS를 통해 ip를 얻고, URL 구조에서 포트를 얻으면 됩니다.


    ip와 port를 구했으므로 소켓의 connect 함수를 이용해서 서버에 접속을 요청할 수 있습니다. HTTP2 버전까지는 TCP/IP 프로토콜을 사용하는데 TCP는 요청 데이터를 전달하기 전 3-WAY Handshake라는 연결 파이프를 생성하는 과정을 진행합니다.

    위 사진을 참고하면 연결 파이프를 생성하는 과정을 볼 수 있습니다. 클라이언트가 먼저 서버에게 SYN 패킷을 보내고 서버가 SYN + ACK 패킷을 보낸 다음 클라이언트가 ACK 패킷을 보내면 연결이 맺어집니다. 여기서는 자세한 설명은 생략했습니다.

    3. 데이터를 송수신한다

    서버와 연결을 맺었다면 브라우저는 요청 데이터를 전송합니다. 요청 데이터는 소켓을 통해 프로토콜 스택으로 전달되고, 프로토콜 스택은 이를 패킷으로 만듭니다. 패킷에는 TCP/IP 프로토콜을 이용하기 위해 TCP 헤더와 IP 헤더가 추가됩니다.


    패킷의 크기는 이더넷에서 1,500바이트 MTU에서 IP 헤더 20바이트(기본 옵션), TCP 헤더 20바이트(기본 옵션)를 제외한 MSS라는 값으로 제한된 1,460바이트 입니다. 따라서 이 크기를 넘는 요청은 패킷이 분할됩니다.


    패킷이 모두 만들어졌으면 LAN 어댑터로 전송을 요청하는데, 이 때 이더넷 프로토콜을 사용하고 MAC 헤더가 필요하므로 프로토콜 스택에서 MAC 헤더를 추가해줍니다. 이는 뒤에서 더 자세히 나옵니다.


    패킷이 발송되면 중간에 허브와 라우터를 통해서 전달되고 서버에서는 이를 받아서 패킷을 분석하고 데이터를 수신합니다. 그 후 ACK 패킷을 날려 데이터를 받았다고 통지합니다. 이 때 패킷을 하나씩 전달하면 비효율적이므로 슬라이딩 윈도우를 이용하는데 자세한 설명은 너무 길어지므로 생략하겠습니다.

    마지막으로 서버는 수신받은 요청을 처리해서 응답을 동일한 통신 구조로 클라이언트에게 전달합니다.

    4. 서버에서 연결을 끊어 소켓을 말소한다

    이제 요청과 응답이 완료됐으므로 연결을 종료합니다. HTTP 1.1에서는 기본적으로 keep-alive를 사용하지만 여기서는 바로 끊는다고 가정합니다.

    연결을 끊을 때는 위와 같이 4-WAY Handshake로 진행합니다. 자세한 설명은 생략하겠습니다.

    5. IP와 이더넷의 패킷 송수신동작

    프로토콜 스택에서 만들어진 패킷은 LAN 어댑터으로 전달되고, LAN 어댑터는 이더넷으로 패킷을 전송합니다. LAN 어댑터에 패킷을 전달하기 전에 이더넷 프로토콜을 위해 MAC 헤더를 추가 해야 합니다. 목적지 MAC 어드레스는 ARP 프로토콜을 사용해서 알아냅니다. IP 주소를 네트워크에 브로드캐스팅하면 목적지 IP를 가지고 있는 노드 또는 목적지 IP에 전달할 수 있는 라우터가 MAC 주소를 응답합니다.


    MAC 어드레스 목적지를 알아냈으니 이를 MAC 헤더에 추가하고 LAN 어댑터에 전달하면 이를 전기 신호로 변환해서 목적지에 전송합니다. 자세한 설명은 생략하겠습니다.

    6. UDP 프로토콜을 이용한 송수신 동작

    TCP 프로토콜은 작은 데이터를 전송하기에는 DNS 같은 1회성 요청에 적합하지 않습니다. 또는 비디오나 음성 같이 실시간성이 중요한 데이터를 전송할 때도 적합하지 않습니다. 따라서 연결이 필요없고, 데이터 전송 확인이 필요없는 UDP를 사용합니다.

    댓글

Designed by Tistory.