다음은 성공과 실패를 결정하는 1%의 네트워크 원리 를 읽고 정리한 내용입니다. 본 글은 CH2. TCP/IP의 데이터를 전기 신호로 만들어 보낸다_프로토콜 스택과 LAN 어댑터의 탐험입니다 🙌



🛺 [Story4] 서버에서 연결을 끊어 소켓을 말소한다

1. 데이터 보내기를 완료하고 연결을 끊는다

  • 소켓 연결 말소 시점은 한쪽이 데이터 보내기를 완료했을때다.
  • 어느 측에서든 먼저 연결을 끊을 수 있도록 프로토콜이 설계 되어 있다.
    • 주로 브라우저에서 요청을 보내고 서버에서 응답을 하면 서버 측에서 먼저 연결 끊기 동작을 실행한다.
  • close 메소드를 호출해서 연결끊기 동작에 들어간다.
  • 연결끊기 동작 세부 로직 - 끊는 쪽 (예. 서버)
    • 연결을 끊고자 하는 측이 TCP 헤더를 만들어서 FIN 컨트롤 비트를 1로 설정한다.
    • 이 패킷을 IP 담당에게 요청하여 상대에게 송신한다.
    • 자신의 소켓에 연결 끊기 동작에 들어갔다는 사실을 통지한다.
  • 연결끊기 동작 세부 로직 - 상대 쪽 (예. 브라우저)
    • 프로토콜 스택이 소켓에 연결 끊기 동작이 들어갔다는 것을 기록하고 패킷을 잘 받았다는 뜻으로 ACK를 보낸다.
    • 어플리케이션이 read를 할 때 데이터를 건내는 대신 데이터 수신을 완료했음을 알리고 FIN을 1로 한 헤더를 IP 담당에게 넘겨 반송한다.
    • 서버에서 ACK를 보내면 연결이 끊기가 완료된다.

2. 소켓을 말소한다

  • 연결 끊기 동식이 실행되었을 때 소켓을 곧바로 말소하지 않고 기다린 후에 소켓을 말소한다.
    • 이유는 ACK가 서버에 도착하지 않아서 서버가 다시 FIN을 전송하게 되는 경우 담당 소켓이 말소되었으므로 동일한 포트번호의 새로운 소켓을 생성하게 되고 해당 소켓에 FIN이 도착하여 오동작하게 된다.

3. 데이터 송수신 동작 요약

  • 처음 소켓을 작성한다. (보통 서버측에서 먼저 소켓을 만들고 접속 대기 상태로 기다린다)
  • 클라이언트에서도 소켓을 만들고 서버로 접속 동작을 실행한다.
    • SYN을 1로 만들고 TCP 헤더를 만들어서 서버에 보낸다. (시퀀스 초기값, 윈도우 값도 포함)
    • 서버에서 ACK 번호, 윈도우값, SYN 1, 시퀀스 초기값을 전송한다.
    • 클라이언트에서 ACK 번호를 보낸다.
  • 데이터를 송수신 한다.
    • 웹의 경우 클라이언트가 요청 메세지를 보내는 것을 시작한다.
    • TCP는 최대 MSS 만큼 패킷을 분할 + 헤더 추가하여 보낸다.
    • 시퀀스 번호와 데이터를 보내면 상대는 ACK 번호와 윈도우 값을 보낸다.
    • 슬라이등 윈도우 기법으로 흐름제어를 한다.
  • 연결을 끊는다.
    • 웹의 경우 서버가 먼저 연결 끊기 동작을 실행한다.
    • FIN 1로 만든 헤더를 보내고 ACK 번호를 응답으로 받는다.
    • 이후 상대도 FIN 1로 만든 헤더를 보내고 ACK를 응답으로 받는다.
    • 잠시 기다린 후 소켓을 말소한다.


출처: 상위 1% 네트워크


🛺 [Story5] IP와 이더넷의 패킷 송수신 동작

  • TCP 담당 부분에서 필요한 헤더 및 데이터를 추가한 이후에 IP 담당 부분에게 의뢰한다.

1. 패킷의 기본

  • 패킷은 헤더 + 데이터로 나뉜다. (주소 등의 제어 정보 + 안의 내용물)


    출처: 상위 1% 네트워크

  • 패킷의 흐름은 패킷의 헤더에 적힌 제어정보와 중계 장치에 있는 표의 정보를 결합하여 다음 패킷 목적지로 이동하며 최종 목적지에 도착한다.

    • 송신처와 최송 수신처를 ‘엔드 노드’라고 부른다.

TCP/IP 에서 패킷 구조

두 가지 중계 장치가 있다. 서브넷을 관리하는 ‘허브’와 IP를 담당하는 ‘라우터’이다.

각각 다음 역할을 한다.

  • 라우터가 목적지를 확인하여 다음 라우터를 찾는다.
    • IP가 다음 목적지를 확인하여 다음 IP 중계 장치를 찾는다.
  • 허브가 서브넷 안에서 패킷을 운반해 다음 라우터에 도착하도록 한다.
    • 서브넷 안의 이더넷이 라우터까지 패킷을 운반한다.

위 역할을 수행하기 위해서 패킷에 다음 두 헤더가 붙어 있다.

  1. MAC 헤더 (이더넷용 헤더)
  2. IP 헤더 (IP용 헤더)
  • 패킷 운반 흐름은 다음과 같다.
    • 먼저 클라이언트가 TCP 헤더 + 데이터를 이어붙이고 목적 IP 주소에 맞는 다음 라우터를 조사한다.
    • 다음 라우터가 정해지면 해당 라우터에 대한 MAC 주소를 조사하고 패킷의 MAC 헤더에 추가한다.
    • 이더넷에게 해당 라우터로 패킷을 전송하도록 의뢰하여 패킷을 송신한다.
    • 이더넷에 의해 허브에 도착한다. 허브에서 이더넷 표와 헤더 정보를 결합해서 다음 라우터로 중계한다.
      • 만일 허브가 여러개라면 여러 허브를 순차적으로 경우한다.
    • 다음 라우터에 도착해서 IP용 표를 통해 다음 라우터를 조사하여 MAC 주소를 헤더가 기록한다.
      • 동일하게 허브를 경유하여 다음 라우터에 도착한다. 수신처에 도착할 때까지 반복한다.


출처: 상위 1% 네트워크

  • 이더넷 대신 무선 LAN, ADSL 등으로 대체될 수 있다.
    • IP의 의뢰를 받아서 패킷을 운반할 수 있는 것이면 된다.
  • 여기까지가 전체적인 흐름!!

2. 패킷 송수신 동작의 개요

IP 담당이 진행하는 패킷 송신 동작을 자세하게 알아보기! IP 담당은 패킷을 송출하고 실제 패킷의 운반은 네트워크 기기인 허브 및 라우터가 수행한다.

  • TCP 담당에서 TCP 헤더와 데이터가 붙은 채로 IP 담당에게 넘어온다.
  • IP 담당은 넘어온 패킷을 들여다보지 않고 단지 헤더를 추가한다.
    • IP 헤더와 MAC 헤더를 추가한다.
  • IP 헤더: 목적지를 나타내는 제어정보
  • MAC 헤더: LAN을 사용해서 가까운 라우터까지 패킷을 운반할 때 사용할 제어정보
  • 완성된 패킷을 네트워크 하드웨어 LAN 어댑터에 보낸다.
    • 0과 1로 이루어진 디지털 데이터의 모습이다.
    • LAN 어댑터는 전기나 빛의 신호로 바꾸어 케이블로 송출한다.
    • 이후 허브나 라우터 등의 중계 장치에 도착한다.
  • IP 담당에서 바라보는 패킷은 그 역할이 구분되어 있지 않고 단순히 ‘패킷’이라는 덩어리일 뿐이다. 패킷의 내용, 순서, 유무도 상관하지 않는다.

3. 수신처 IP주소를 기록한 IP 헤더를 만든다


출처: 상위 1% 네트워크

  • 수신처 IP주소 → 어플리케이션에서 통지한 그대로를 사용
  • 송신처 IP주소 → 여러 LAN 어댑터 중 송신을 책임지는 어댑터(대상 라우터가 정해지면 정해짐)의 IP 주소 사용

IP 경로표

  • route print 로 경로표를 확인할 수 있다.

    • 수신처 IP 주소의 왼쪽 부분이 일치하면 해당하는 행의 정보가 알맞은 것이다.
      • 예를 들어 수신처 IP가 10.10.1.166 이면 왼쪽이 일치하는 10.10.1이 알맞은 행이다.
      • Interface로 네트워크용(LAN 어댑터) 인터페이스를 알 수 있다.
      • Gateway로 다음 라우터 IP 주소를 알 수 있다!!!
      • 가장 위 행은 기본 게이트웨이를 나타낸다 (추후 설명)
      • 어느 LAN 어댑터에서 보내는지 정하고 해당 IP 주소를 송신처 IP 주소로 설정한다.
  • IP 헤더에 어느 프로토콜 (TCP, UDP 등등)을 사용하는지 번호를 작성한다.

4. 이더넷용 MAC 헤더를 만든다

MAC 헤더는 이더넷이 사용한다.

  • 수신처 MAC 주소, 송신처 MAC주소, 이더 타입(사용하는 프로토콜 종류 ARP, IP, IPv6 등등)

MAC 주소 알아보기

  • MAC 주소는 48비트이다.
  • 이더타입에 프로토콜 번호를 기입한다.
    • 이더넷의 경우 IP혹은 ARP이다.
  • 송신처 MAC주소에 LAN 어댑터의 MAC 주소를 설정한다.
  • 수신처의 MAC 주소를 조사해서 설정한다.
    • 경로표의 Gateway가 패킷을 건내줄 대상이다.
    • 이 IP 주소로 MAC 주소를 조사한다.

5. ARP로 수신처 라우터의 MAC 주소를 조사한다

  • 이더넷에 브로드캐스를 통해 연결된 전원에게 xx IP 주소(게이트웨이의 IP 주소)를 물어봐서 MAC주소를 획득한다.
    • 상대가 자신과 같은 네트워크라면 이렇게 MAC주소를 알 수 있다. (Gateway가 라우터 IP 주소인 경우 라우터가 응답한다)
    • 해당하지 않는 기기는 브로드캐스트 메세지를 무시한다.
    • ARP 응답이 없다면 패킷 송신 동작이 실패한다.
    • 매번 ARP 패킷을 보내는 것은 어렵기 때문에 메모리에 ARP 캐시 데이터를 저장한다.
      • arp -a 를 통해 ARP 캐시데이터를 확인
      • arp -d 를 통해 캐시 데이터 삭제
      • 몇 분이 지나면 캐시 데이터를 삭제한다 → IP가 더이상 유효하지 않을수 있기 때문이다.
    • MAC 헤더를 붙이면 LAN 어댑터가 패킷을 그대로 송수신할 수 있다.
    • MAC주소는 : 또는 -로 구분하며 총 48피트이고 8비트씩 16진수로 나타낸다.

6. 이더넷의 기본

  • 이더넷은 컴퓨터가 여러 컴퓨터와 적은 비용으로 자유롭게 통신하기 위한 통신 기술이다.
  • 원형은 하나의 케이블에 여러 컴퓨터가 연결이 되어 있어서 케이블로 전체에게 신호가 가고 MAC헤더를 통해 수신처를 판단하여 다른 대상들을 해당 패킷을 폐기하고 대상 컴퓨터만 패킷을 받게 되는 구조이다.
  • 케이블 → 리피터 허브 → 스위칭 허브(현재 모습)으로 변화했다.
    • 전원에게 신호를 보내는 것이 아니라 MAC 주소로 알아낸 원하는 상대에게만 신호가 흐른다.
  • 이더넷의 동작도 패킷의 내용과는 아무런 상관이 없다.

7. IP 패킷을 전기나 빛의 신호로 변환하여 송신한다

  • LAN 어댑터가 디지털 데이터를 전기나 빛의 신호로 변환하여 네트워크 케이블에 송출한다.
  • LAN 어댑터를 제어하는 LAN 드라이버라는 소프트웨어가 필요하다.

8. 패킷에 3개 제어용 데이터를 추가한다

  • 프리앰블, 스타트 프레임 딜리미터, 프레임 체크 시퀀스(오류 검출용 데이터)를 추가한다.
  • 프리앰플로 클록신호의 타이밍을 잡는다.
  • 스타트 프레임 딜리미터로 패킷 신호 시작을 나타낸다.
  • FCS로 오류를 검출한다.


출처: 상위 1% 네트워크


출처: 상위 1% 네트워크

9. 허브를 향해 패킷을 송신한다

  • 리피터 허브의 반이중 모드 & 스위치 허브의 전이중 모드가 있다.
  • 반이중 모드
    • 케이블에 다른 송신 동작이 흐르고 있으면 대기했다가 송신 동작을 시작한다.
    • 동시에 신호가 흐르면 충돌이 나며 재밍 신호를 보내고 송신 동작을 멈추고 잠시 후 다시 시작한다.
  • 전이중 모드는 충돌이 일어나지 않는다. (추후 설명)

10. 돌아온 패킷을 받는다

  • 리피터 허브에서는 한대에서 송신해도 전체에 신호가 간다. 이것을 모두 수신 신호로 받는다.
  • 프리앰블로 타이밍일 계산하고 스타트 프레임 딜리미터가 나오면 그 다음 비트부터 패킷으로 판단해 디지털 데이터로 변환한다. 최후에 FCS를 검사하여 오류가 있다면 폐기한다.
  • 오류가 없다면 MAC헤더 수신처와 MAC 주소를 조사하여 자신의 것이면 수신하여 버퍼 메모리에 저장하고 아니라면 패킷을 폐기한다.
  • 자신의 것이라서 패킷을 수신하면 interrupt 인터럽트로 컴퓨터에 통지한다.

11. 서버의 응답 패킷을 IP에서 TCP로 넘긴다

  • 웹서버에서 패킷이 돌아오면 (LAN 어댑터가 프로토콜 번호를 확인해 TCP/IP 프로토콜 스택으로 전송함) 프로토콜 스택의 IP 담당 부분에 넘겨진다.
    • IP 헤더를 조사해 수신처 IP주소를 조사하여 LAN 어댑터와 일치하는지 확인하고 패킷을 수신한다.
    • 만일 자신에게 온 패킷이 아니라면 IP 담당 부분이 ICMP 메세지로 통신 상대에게 오류를 통지한다.
      • 여러 메세지 종류가 있다.
  • 만일 패킷이 fragment로 분할된 것이면 IP 담당은 패킷을 복원한다. (이후에 패킷 분할에 대해서 다룬다)
    • IP 헤더의 flag로 분할여부를 확인할 수 있다.
    • ID 정보로 같은 패킷임을 확인할 수 있다.
    • fragment offset으로 패킷 위치를 알 수 있다.
    • 패킷을 복원하는 동작 = reassembling 리어셈블링이라고 한다.
  • 리어셈블링이 끝나면 패킷을 TCP 담당 부분에 넘긴다.

🛺 [Story6] UDP 프로토콜을 이용한 송수신동작

1. 수정송신이 필요없는 데이터 송신은 UDP가 효율적이다.

  • ex. DNS 서버에서 IP 주소를 조회할 때
  • 만일 데이터를 보내서 수신응답이 오지 않으면 패킷을 전부 다 보내는 간단한 방법이 있다.
    • 하지만 그것을 비효율적이니 TCP가 누락된 부분만 보내기 위해서 복잡한 구조인 것이다.
  • 패킷이 하나라면 복잡하게 생각하지 않고 회신이 오지 않으면 다시 보내면 된다.

2. 제어용 짧은 데이터

  • DNS 조회 같은 경우 패킷 1개로 가능한 짧은 요청이기 때문에 UDP를 사용한다.
  • 접속이나 연결 끊기 단계가 없이 송신 데이터에 UDP 헤더만 추가하여 바로 IP 담당에 의뢰하여 송신한다.
  • 만일 오류가 생기면 송신측에서 회답이 오지 않으므로 데이터를 한번 더 보낸다.

3. 음성 및 동영상 데이터

  • UDP를 많이 사용한다. 타이밍이 맞지 않으면 데이터가 다시 와도 쓸모가 없으므로 잠시 누락되어도 괜찮다.

⇒ 이 다음은 케이블로 나간 전기 및 빛 신호가 리피터 허브, 스위칭 허브, 라우터 기기를 통해 인터넷으로 나가는 과정이다.



[용어]

ARP - Address Resolution Protocol

FCS - Frame Check Sequence