학교/네트워크

[네트워크] 2-2. TCP/IP의 데이터를 전기 신호로 만들어 보낸다.

daykim 2023. 3. 19. 00:38
아래 도서 참고
 

성공과 실패를 결정하는 1%의 네트워크 원리 | Tsutomu Tone - 교보문고

성공과 실패를 결정하는 1%의 네트워크 원리 | 『성공과 실패를 결정하는 1%의 네트워크 원리』는 네트워크 전체의 움직임을 해설하고 현실의 네트워크 기기나 소프트웨어가 어떻게 움직이는지

product.kyobobook.co.kr

 

목차

  • 서버에서 연결을 끊어 소켓을 말소한다.
  • IP와 이더넷의 패킷 송,수신 동작
  • UDP 프로토콜을 이용한 송,수신 동작

 

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


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

데이터 보내기를 완료한 쪽에서 연결 끊기 단계에 들어간다.
여기서는 서버측에서 연결 끊기 단계에 들어가는 것으로 간주한다.

  1. 서버측 애플리케이션이 먼저 Socket 라이브러리의 close를 호출한다.
  2. 서버측 프로토콜 스택이 TCP 헤더를 만들어 연결 끊기를 나타내는 정보를 설정한다.
    • 컨트롤 비트의 FIN을 1로 설정한다.
    • FIN : 연결 끊기를 나타낸다.
  3. IP 담당 부분에 의뢰해 클라이언트에 송신해 달라고 한다.
    이와 동시에 서버측 소켓에 연결 끊기 동작에 들어갔다는 정보를 기록한다.

  4. 클라이언트 측에 FIN에 1을 설정한 TCP 헤더가 도착하면, 프로토콜 스택은 자신의 소켓에 서버측이 연결 끊기 동작에 들어갔다고 기록한다.
  5. FIN을 1로 설정한 패킷을 받은 사실을 알리기 위해, ACK 버호를 서버측에 반송하고, 애플리케이션이 데이터를 가지러 올 때까지 기다린다.
  6. 애플리케이션이 read를 호출해 데이터를 가지러 온다.
  7. 서버에서 보낸 데이터를 전부 수신 완료했다는 사실을 클라이언트 측의 애플리케이션에게 알린다.
  8. 클라이언트측 애플리케이션도 close를 호출한다.
  9. 클라이언트 측 프로토콜 스택은 FIN비트에 1 설정한 TCP 헤더를 만들어 IP 담당 부분에 의뢰해 서버에 송신한다.
  10. 서버에서 ACK 번호가 돌아오면, 서버와의 대화가 끝난다.

 

2. 소켓을 말소한다.

연결 끊기 동작이 실행되었을 때 소켓을 곧바로 말소하지 않고 기다린 후 소켓을 말소한다.

ex) ACK가 도착하지 않아 FIN을 재전송했을 때, 말소된 소켓의 포트번호와 동일한 포트버호가 새로운 소켓에 할당되면 오동작하게 된다.

 

3. 데이터 송, 수신 동작을 정리한다.

앞서 설명한 전체 동작을 정리한다.

 

 

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


1. 패킷의 기본

패킷의 기본형

헤더 데이터 (내용)

TCP/IP의 패킷

MAC 헤더 IP 헤더 TCP 헤더 데이터 조각
  IP의 패킷
이더넷의 패킷
  • 헤더 : 수신처를 나타내는 주소 등의 제어정보가 저장된다.
  • 데이터 : 의뢰처에서 의뢰한 데이터

 

패킷을 목적지까지 운반

  • 송신처가 되는 기기가 패킷을 만들어, 가장 가까운 중계 장치에 송신한다.
  • 중계창지는 도착한 패킷의 헤더에 기록된 수신처와, 수신처가 어느 방향에 있는지 기록된 표에 등록된 내용을 결합해, 헤더의 목적지를 판단한다.
  • 목적지를 향해 패킷을 송신하면, 다음 중계 장치에 도착한다.
  • 이러한 과정을 반복하면 최종적으로 수신처에 패킷이 도착한다.
  • 수신처에서 송신처에 회답 패킷을 보내면, 수신처인 기기가 송신처가 되는 것이다.
  • 엔드 노드 : 송신처와 수시넟의 기기를 묶어서 표현한 것이다.
  • 중계(중간) 노드 : 중계 장치를 표현한다.

 

TCP/IP에서 패킷 구조

패킷 중계 장치

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

위 역할을 수행하기 위해 아래 헤더가 붙어있다.

  • MAC 헤더 (이더넷용 헤더)
  • IP 헤더 (IP용 헤더)

 

TCP/IP에서 패킷 운반 흐름

  1. 송신처에서 패킷의 목적지가 되는 액세스 대상 서버의 IP 주소를, IP 헤더의 수신처에 기록한다.
  2. IP는 이 수신처가 어느 방향에 있는지 조사하고, 그 방향에 있는 다음 라우터를 조사해,
    다음 라우터에 할당된 이더넷의 주소(MAC 주소)를 MAC 헤더에 기록한다.
  3. 이더넷에게 해당 라우터로 패킷을 전송하도록 의뢰해 송신한다.
  4. 송신한 패킷이 허브에 도착하면, 허브에 있는 패킷의 목적지를 판단하기 위한 표(이더넷용 표)와 이더넷 헤더의 수신처 정보를 결합해 패킷의 목적지를 판단해 중계한다.
  5. 허브가 복수개면 순차적으로 허브를 경유한다.
  6. 다음 라우터에 도착하면, 라우터에 있는 IP용 표와 IP 헤더의 수신처를 결합해 다음 라우터를 조사하고, 해당 라우터의 MAC 주소를 MAC 헤더에 기록 한다.
  7. 패킷을 다음 라우터에 송신한다.
  8. 이것이 반복되면, 패킷은 목적지에 도착한다.
  • IP의 의뢰를 받아 패킷을 운반할 수 있으면, 이더넷이 아닌 다른 것으로 대체 가능하다.

 

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

IP 담당 부분의 패킷 송신 동작

  • IP 담당 부분은 패킷을 상대에게 송출만 하고, 운반은 허브나 라우터가 한다.
  1. TCP 담당 부분에서 데이터 조각에 TCP 헤더를 부가한 것을 IP 담당 부분에게 건네준다.
  2. IP 담당 부분은 받은 데이터 앞에 제어 정보를 기록한 IP, MAC 헤더를 부가한다.
  3. 만든 패킷을 네트워크용 하드웨어에 건네준다.
  4. LAN 어댑터에 의해 전기나 빛의 신호 상태로 바뀌어 케이블에 송출된다.
    • LAN 어댑터에 건네줄 때 패킷의 모습은 0이나 1의 비트가 이어진 디지털 데이터다.
  5. 신호는 허브나 라우터 등의 중계장치에 도착하고, 중계장치가 수신측까지 패킷을 전달한다.
  6. 케이블에서 신호의 모습을 한 패킷이 돌아오면, LAN 어댑터에서 디지털 데이터의 모습으로 되돌리고, IP 담당 부분에게 건내준다.
  7. IP 담당 부분이 TCP 헤더와 데이터 조각을 TCP 담당 부분에게 건네준다.

 

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

IP 담당 부분은 TCP 담당 부분에서 송, 수신 의뢰를 받으면, IP 헤더를 만들어 TCP 헤더의 앞에 붙인다.

  • 수신처 IP 주소 : 패킷을 전달할 곳을 나타낸다. 애플리케이션에서 통지한 그대로 사용한다.
  • 송신처 IP 주소 : 송신을 책임지는 LAN 어댑터에 할당된 IP 주소로 설정한다.
  • 프로토콜 번호 : 패킷에 들어간 내용물이 어디에서 의뢰받은 것인지 나타내는값을 설정한다.

경로표

  • 라우터에 있는 IP용 표
  • Network Destination 항목과 비교해, 어느 해당하는지 찾아낸다.
  • Gateway : 다음 라우터의 IP 주소가 기록되어 있다.
  • 기본 게이트웨이 : 맨 위 행의 넷마스크로 0.0.0.0으로 등록되어 있다.
    일치하는 행이 없으면, 이 행이 해당하는 것으로 간주한다.

 

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

IP 헤더 앞에 MAC 헤더를 붙인다.

  • 이더넷에는 TCP/IP 개념이 통용되지 않는다.
  • 따라서 이더넷의 수신처 판단 구조로 사용하는 것이 MAC 헤더다.
  • MAC 주소는 48비트고, 한 개의 값으로 생각한다.

MAC 헤더 항목

  • 수신처 MAC 주소 : 패킷을 전달하는 상대의 MAC 주소를 설정한다.
    • 경로표에서 찾은 일치하는 행의 Gateway 항목에 기록된 IP 주소의 기기가 패킷을 건네줄 상대다.
    • 이 IP 주소로 MAC 주소를 조사한다.
  • 송신처 MAC 주소 : 자체의 LAN 어댑터의 MAC 주소를 설정한다.
  • 이더 타입 (Ether Type) : 사용하는 프로토콜 종류를 나타낸다. (이더넷은 주로 IP, ARP 사용)

 

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

ARP (Address Resolution Protocol)

  • 라우터의 MAC 주소를 조사한다.
  • 에더넷에는 연결된 전원에게 패킷을 전달하는 브로드캐스트 구조가 있다.
  • 브로드캐스트 구조를 이용해 필요한 IP 주소를 가진 기기에게 응답이 돌아오면, 해당 MAC 주소를 MAC헤더에 설정한다.
  • 경로표의 내용이 올바르면, 상대가 같은 서브넷에 존재한다.
  • 존재하지 않으면, 상대가 없는 것이 되어 패킷의 송신 동작이 실패로 끝난다.

ARP 캐시

패킷 전송때마다 브로드캐스트 구조를 사용하면, ARP 패킷이 불어난다.
따라서 한 번 조사한 결과는 ARP 캐시라는 메모리 영역에 저장해두고, 캐시에 없는경우 ARP를 조회한다.

ARP 캐시 내용과 현실 사이에 일치하지 않을 수 있기 때문에, 캐시에 저장된 값은 시간이 지나면 삭제한다.

 

6. 이더넷의 기본

이더넷

다수의 컴퓨터가 여러 상대와 자유롭게 적은 비용으로 통신하기 위해 고안된 통신 기술

  • 하나의 케이블에 여러 컴퓨터가 연결되어, 케이블로 신호가 가고,
    MAC 헤더를 통해 수신처를 판단해 다른 대상들은 해당 패킷을 폐기하고, 대상 컴퓨터만 패킷을 받는 구조다.
  • 현재는 스위칭 허브를 이용한 형태가 보급되어있다.
  • 수신처 MAC 주소로 나타내는 원하는 기기가 존재하는 부분에만 신호가 흐른다.

 

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

  • LAN 어댑터는 IP가 만든 패킷인 디지털 데이터를 전기나 빛의 신호로 변환해 네트워크 케이블에 송출한다.
  • LAN 어댑터를 제어하기 위해선 LAN 드라이버 소프트웨어가 필요하다.
  • LAN 어댑터의 ROM에는 전 세계에서 중복되지 않도록 일원화되어 관리되는 MAC 주소가 기록되어 있다.
  • MAC 주소는 LAN 드라이버가 MAC 회로에 설정한다.
  • Media Access Control

 

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

패킷을 신호로 변환해 케이블에 송출하기

  1. LAN 드라이버는 IP 담당 부분에서 패킷을 받으면, 그것을 LAN 어댑터의 버퍼 메모리에 복사한다.
  2. 복사 후 패킷을 송신하도록 MAC 회로에 명령을 보내면, MAC 회로의 작업이 시작된다.
  3. MAC 회로는 송신 패킷을 버퍼 메모리에서 추출하고 3개의 제어용 데이터를 추가한다.
    • 맨 앞 : 프리앰블, 스타트 프레임 딜리미터
    • 맨 뒤 : 프레임 체크 시퀀스 (FCS)
  • 프리앰블 : 클록 신호의 타이밍을 잡는다. / 송신하는 패킷을 읽을 타이밍을 잡는다.
  • 스타트 프레임 딜리미터 :  패킷 신호 시작을 나타낸다.
  • FCS : 오류를 검출용 데이터

 

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

프리앰블, 스타트 프레임 딜리미터, FCS 세 가지를 부가하면, 케이블에 송출하는 패킷이 완료된다.

  • 이더넷은 송신이 잘 되었는지 확인하지 않는다. 오류가 발생해도 TCP가 검출한다.

신호를 송신하는 동작에는 두 가지 모드가 있다.

반이중 모드

  • 리피터 허브를 사용
  • 케이블에 다른 기기가 송신한 신호가 흐르고 있으면, 대기했다가 송신한다.
  • 신호가 정지했거나 애초부터 없었으면, 송신 동작을 시작한다.
  • 만약, 복수의 기기가 동시에 송신 동작에 들어가면 충돌이 발생한다.
  • 충돌이 발생한 사실을 다른 기기에 알리기 위해 재밍 신호를 흘리고 잠시 기다린다.
  • 송신 동작을 다시 시도했을 때, 또 다시 충돌이 발생하면 대기 시간을 늘린다.
  • 충돌때마다 대기시간을 2배씩 늘리고, 10배가 되면 오류로 판단한다.

전이중 모드

  • 스위칭 허브를 사용
  • 송, 수신을 동시에 실행하면서 충돌은 일어나지 않는다.

 

10. 돌아온 패킷을 받는다.

  • 반이중 동작의 리피터 허브는 1대가 송신한 신호가, 리피터 허브에 접속된 케이블 전부에 흘러간다.
  • 프리앰블로 타이밍을 계산해 스타트 프레임 딜리미터가 나오면, 그 다음부터 디지털 데이터로 변환해 버퍼 메모리에 저장한다.
  • 패킷의 맨 앞부터 계산한 FCS 값과 패킷의 FCS 값이 다르면 오류 패킷으로 간주해 폐기한다.
  • FCS에 문제가 없으면, MAC 헤더의 수신처 MAC 주소를 조사해 자신에게 오는 것인지 판단한다.
  • 다른곳에 갈 패킷은 폐기하고, 자신에게 오는 경우에만 버퍼 메모리에 저장한다.
  • MAC 회로가 할 일이 끝나면 컴퓨터 본체에 인터럽트를 통해, 패킷 수신 사실을 통지한다.

 

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

웹 서버에서 패킷이 돌아온 것으로 간주하고, 다음 프로토콜 스택의 동작을 추적해보자.

  • LAN 드라이버는 TCP/IP 프로토콜 스택에 패킷을 건넨다.
  • IP 담당 부분은 IP 헤더 부분을 조사해 포맷에 문제가 없는지 확인하고, 수신처 IP 주소를 조사한다.
    • 서버에서 회신된 패킷의 수신처 IP 주소와, 수신한 LAN 어댑터에 할당된 주소가 일치하면 패킷을 수신한다
    • 일치하지 않으면, ICMP라는 메시지를 이용해 상대에게 오류를 통지한다.

리어셈블링 (reassembling)

  • 짧은 패킷만 다룰 수 있는 통신 회선이나, LAN은 패킷을 분할해 사용한다.
  • 플래그 : 분할된 패킷인지를 나타낸다.
  • 분할된 패킷이면, IP 담당 내부의 메모리에 일시적으로 보관한다.
  • 프레그먼트 오프셋(fragment offset) : 패킷이 원래 패킷의 어느 부분에 있었는지 나타내는 정보
  • 프레그먼트 오프셋을 바탕으로 분할된 패킷이 전부 도착하면, 패킷을 원래 모습으로 되돌리는 것을 리어셈블링이라고 한다.

이것으로 IP 담당 부분의 역할은 끝나고, TCP 담당 부분에게 패킷을 건네준다.

 

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


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

  • 데이터가 한 개의 패킷에 수용할 수 있을만큼 길이가 짧은 경우에 TCP 처럼 복잡한 방법을 사용할 필요가 없다.
  • 데이터를 전부 보낸 후, 수신측에서 수신 확인을 받는 방법을 사용하면 된다.
  • 도착하지 않은 경우 한 번 더 보내면 된다.
  • 패킷이 한 개 뿐이므로, 낭비가 아니다.
  • 접속하거나 연결을 끊을 때 제어용 패킷을 보낼 필요가 없다.
    회신이 돌아오면, 수신 확인 응답을 대신할 수 있기 때문이다.

 

2. 제어용 짧은 데이터

  • DNS 서버에 대한 조회 등 제어용으로 실행하는 정보 교환은 한 개의 패킷으로 끝나는 경우가 많아 UDP를 사용한다.
  • 접속이나 연결 끊기 단계가 없다.
  • 애플리케이션이 송신 데이터를 받으면, UDP 헤더를 부가하고 이것을 IP에 의뢰해 송신하면 된다.
  • 오류가 발생하면, 회답이 오지 않으므로 애플리케이션이 그 사실을 알아채고 다시 보내면 된다.

UDP 헤더 항목

  • 송신처 포트 번호
  • 수신처 포트 번호
  • 데이터 길이 : UDP 헤더 이후의 길이
  • 체크섬 : 오류 유무 검사

 

3. 음성 및 동영상 데이터

  • 음성이나 영상의 데이터를 보낼때도 UDP를 사용한다.
  • TCP를 사용하면, 다시 보낼 때 시간이 많이 걸려 재생 타이밍이 맞지 않을 수 있다.
  • 타이밍이 맞지 않으면 데이터가 다시 와도 쓸모가 없기 때문이다.