02. TCP IP의 데이터를 전기 신호로 만들어 보낸다. - chwyym/Network GitHub Wiki

2. TCP/IP 신호를 전기 신호로 바꾸어 보낸다.

1. 소켓을 작성한다.

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

  • 브라우저나 메일 등의 일반적인 애플리케이션이 데이터를 송수신할 경우에는 TCP
  • DNS 서버에 대한 조회 등에서 짧은 제어용 데이터를 송수신할 경우에는 UDP
애플리케이션
	+ 네트워크 애플리케이션
	+ Socket 라이브러리
		+ 리졸버

OS
	+ 프로토콜 스택
		+ TCP/UDP
		+ IP : 
			+ ICMP : Internet Control Message Protocol
			+ ARP : Address Resolution Protocol
			
드라이버 소프트웨어
	+ LAN 드라이버 : LAN 어댑터 제어
	
하드웨어
	+ LAN 어댑터
  • 애플리케이션
    • 맨 위에 있는 것은 네트워크 어플리케이션 이다.
      • 웹 서버, 메일 서버 등의 프로그램이 여기에 해당한다.
    • 애플리케이션의 아랫 부분에는 Socket 라이브러리 가 있으며, 그 안에는 리졸버 가 내장되어 있다.
  • OS
    • TCP 라는 프로토콜을 사용하여 데이터 송수신을 담당하는 부분과
    • UDP 라는 프로토콜을 사용하여 데이터 송수신을 담당한다.
    • 이 둘이 어플리케이션에서 보낸 의뢰를 받아 송수신 동작을 실행한다.
    • 그 아래의 IP 프로토콜을 사용하여 패킷 송수신 동작을 제어하는 부분이 있다.
      • 이 IP 안에는 ICMP와 ARP 라는 프로토콜을 다루는 부분이 포함되어 있다.
      • ICMP는 패킷을 운반할 때 발생하는 오류를 통지하거나 제어용 메세지를 통지할 때,
      • ARP는 IP 주소에 대응하는 이더넷의 MAC 주소를 조사할 때 사용한다.
  • LAN 드라이버
    • LAN 어댑터의 하드웨어를 제어한다.
  • LAN 어댑터
    • 실제 송수신 동작, 즉 케이블에 대해 신호를 송수신하는 동작을 실행한다.

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

  • 프로토콜 스택은 소켓에 기록된 제어 정보를 참조하면서 움직인다.
  • 프로토콜 스택은 내부에 제어 정보를 기록하는 메모리 영역을 가지고있으며, 여기에 제어 정보를 기록한다.

    • 대표적인 정보는 수신처의 IP는 무엇인가? 포트 번호는 몇 번인가? 통신 동작의 진행 상태는 어떠한가?이다.
    • 이러한 제어 정보를 기록한 메모리 영역이 소켓의 실체라고 생각해도 좋다.
  • 프로토콜 스택은 이 제어정보를 참조하여 동작한다.

    • 데이터를 송신할 때는 소켓의 상대측 IP 주소나 포트 번호를 참조한다.
    • 응답이 돌아오는 지의 여부와 송신 동작 후의 경과 시간 등이 포함되어 있다.
  • netstat -ano

    > netstat -ano
    
    활성 연결
    
     프로토콜  로컬 주소              외부 주소              상태            PID
      TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1116
      TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       4368
      TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
      TCP    0.0.0.0:1536           0.0.0.0:0              LISTENING       808
      TCP    0.0.0.0:1537           0.0.0.0:0              LISTENING       720
      TCP    0.0.0.0:1538           0.0.0.0:0              LISTENING       1504
      TCP    0.0.0.0:1539           0.0.0.0:0              LISTENING       2012
      TCP    0.0.0.0:1540           0.0.0.0:0              LISTENING       3176
      TCP    0.0.0.0:1548           0.0.0.0:0              LISTENING       792
      TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING       9820
      TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING       4
      TCP    0.0.0.0:7680           0.0.0.0:0              LISTENING       19464
      TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       36240
      TCP    0.0.0.0:8733           0.0.0.0:0              LISTENING       4
    • PID : 프로세스 식별자.
    • 상태
      • LISTENING : 상대의 접속을 기다리고 있는 상태
      • ESTABLISHED : 접속 동작이 끝나고 데이터가 통신중인지 나타냄
    • 외부 주소
      • 통신 상대측의 IP 주소와 포트 번호
    • 로컬 주소
      • netstat 명령을 실행한 기계 자체 의 IP주소와 포트 번호
    • 프로토콜
      • 프로토콜의 종류

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

소켓 작성

소켓을 만들 때 한 개의 메모리 영역을 확보하고 초기 상태라는 것을 이 영역에 기록한다.

  • 애플리케이션이 socket을 호출하여 소켓을 만들 것을 의뢰하면, 프로토콜 스택은 의뢰에 따라서 한개의 소캣을 만든다.
  • 이때, 프로토콜 스택이 최초로 하는 일은 메모리 영역을 확보하는 것이다.
    • 여기에는 제어 정보가 담기게 된다.
    • 이 시점은 소켓이 작성된 직후, 송수신 동작이 시작되지 않은 초기 상태이다.
    • 따라서 초기 상태임을 나타내는 제어 정보를 소켓의 메모리 영역에 기록한다.
  • 소켓이 만들어지면 스켓을 나타내는 디스크립터 를 어플리케이션에 알려준다.
    • 디스크립터 는 소켓을 가리키는 번호표와 같은 정보이다.




02. 서버에 접속한다.

1) 접속의 의미

소켓을 만들면 애플리케이션(브라우저)은 connect를 호출한다. 그러면 프로토콜 스택은 자기쪽의 소캣을 서버측의 소켓에 접속한다.

  • 통신 상대와의 사이에 제어 정보를 주고받아 소켓에 필요한 정보를 기록하고 데이터 송수신이 가능한 상태로 만든다.
    • 예시) 클라이언트측의 IP 주소나 포트 번호를 서버측에 알림
  • 접속 동작에서 주고받는 제어 정보는 통신의 규칙으로 정해져 있다.
  • 테이터 송수신 동작을 수행할 때 송수신하는 데이터를 일시적으로 저장하는 메모리 영역을 버퍼 메모리 라고 한다.

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

통신 동작에 이용하는 제어 정보는 다음의 두 종류이다.

  • 헤더에 기입되는 정보
  • 소켓(프로토콜 스택의 메모리 영역)에 기록되는 정보

헤더

  • 패킷에는 제어 정보를 패킷의 맨 앞부분에 부가하는데 이것을 헤더 라고 한다.

    • 이더넷이나 IP에더 같은 제어 정보가 있고, 이것도 헤더 라고 부른다.
  • 클라이언트와 서버는 이 헤더에 필요한 정보를 기록하여 연락을 취한다.

    • 예시

      송신측: 데이터 송신 동작을 개시합니다.
      수신측: 잘 알겠습니다.
      송신측: OO번째 데이터를 보냅니다.
      수신측: OO번째 데이터를 잘 받았습니다.
      (이하 생략)
      
    • 이러한 대화가 헤더에 기록된 제어 정보에 의해 이루어진다.

소켓

  • 소켓에는 애플리케이션에서 통지된 정보, 통신 상대로부터 받은 정보 등이 수시로 기록된다.
  • 송수신 동작의 진행 상황 등도 수시로 기록된다.
  • 프로토콜 스택은 하나하나 차례로 정보를 참조하면서 움직인다.
  • 소켓에 기록한 제어 정보는 상대측에서 볼 수 없다.
    • 상대가 볼 수 있는건 규칙에 따라 헤더의 제어 정보 뿐이다.
      • 내부 구조가 다른 OS인 윈도우와 리눅스는 프로토콜 스택을 만드는 방법이 다르다.
      • 따라서 필요한 프로토콜 스택의 제어 정보도 달라진다.
      • 이 OS들은 패킷의 제어 정보로 문제없이 통신한다.

3) 접속 동작의 실체

접속 동작의 첫 걸음은 TCP 담당 부분에서 접속을 나타내는 제어 정보를 기록한 TCP 헤더를 만드는 것이다. 그리고 TCP 헤더의 송신처와 수신처의 포트 번호로 접속하는 소켓을 지정한다.

connect(<디스크립터>, <서버측의 IP 주소와 포트 번호>, ......)
  • 여기에 서버측의 IP 주소와 포트 번호를 쓰면 명령이 프로토콜 스택의 TCP 담당 부분에 전달한다.
  • TCP 담당 부분은 IP 주소로 표시된 상태, 즉 서버의 TCP 담당 부분과의 사이에서 제어 정보를 주고받는다.

접속 동작

  1. 데이터 송수신 동작의 개시를 나타내는 제어정보를 기록한 헤더를 만든다.
  • 송신처수신너포트 번호가 포함된다.
  • 컨트롤 비트SYN이라는 비트를 1로 만든다.
  1. IP 담당 부분에 건내주어 송신하도록 의뢰한다.
  2. 그러면 IP 담당 부분이 패킷 송신 동작을 실행한다.
  3. 네트워크를 통해 패킷이 서버에 도착하면 서버측 IP 담당이 이것을 받아 TCP 담당에 건넨다.
  4. 서버측의 TCP 담당 부분이 TCP 헤더를 조사하여 기록되어 있는 수신처 포트 번호에 해당하는 소켓을 찾는다.
    • 접속을 기다리는 상태에 있는 소켓 중에서 TCP 헤더에 있는 수신처 포트 번호와 같은 번호가 기록된 소켓이다.
  5. 소켓을 찾으면 필요한 정보를 기록하고 접속 동작이 진행중이라는 상태가 된다.
  6. 이 과정이 끝나면 서버의 TCP 담당 부분은 응답을 돌려보낸다.
    • 클라이언트와 마찬가지로 수신처의 포트 번호나 SYN 비트 등을 설정한 TCP를 만든다.
    • 응답을 돌려보낼 때, ACK라는 컨트롤 비트도 1로 만든다.
    • 이것은 패킷을 받은 것을 알리기 위한 동작이다.
  7. IP 담당을 거쳐서 클라이언트에 반송되도록 의뢰한다.
  8. 패킷이 클라이언트에 도착하고 IP 담당 부분을 경유하여 TCP 담당에 도착한다.
    • TCP 헤더를 조사하여 서버측의 접속 동작 성공을 확인한다.
    • SYN이 1이면 접속 성공이므로
    • 서버의 IP 주소, 포트 번호, 접속 완료 상태 등의 제어 정보를 기록한다.




3. 데이터를 송수신한다.

1) 프로토콜 스택에 HTTP 리퀘스트 메시지를 넘긴다.

  • 애플리케이션이 write를 호출하여 송신 데이터를 프로토콜 스택에 건네주는 곳부터 시작된다.

  • 프로토콜 스택은 받은 데이터의 내용을 알지 못한다.

  • 프로토콜 스택은 받은 데이터를 바로 송신하지 않고 자체 내부에 있는 송신용 버퍼 메모리에 저장한다.

    • 애플리케이션이 다음 데이터를 건네주기를 기다린다.
    • 그 이유는 송신 의뢰가 올 때마다 데이터를 보내면 네트워크 효율이 떨어지기 때문이다.
  • 송신용 메모리 버퍼에 데이터를 저장할 때 어느 정도까지 저장할지는 다음과 같은 판단 요소로 결정합니다.

    • MTU라는 매개변수를 바탕으로 판단한다.

    • 한 패킷으로 운반할 수 있는 디지털 데이터의 최대 길이이다.

    • 이더넷에서는 보통 1,500바이트가 된다.

    • MSS

      • MTU에는 패킷의 맨 앞부분에 헤더가 포함되어 있는데, 이 헤더를 제외한 부분을 MSS라고 한다.
      • 이것은 애플리케이션에서 받을 수 있는 데이터의 최대 크기이다.
    • 타이밍

    • 애플리케이션의 송신 속도가 느려지는 경우 MSS에 가깝게 데이터를 저장하면 송신 동작이 지연된다.

    • 따라서 버퍼에 데이터가 모이지 않아도 적당한 곳에서 송신 동작을 실행해야 한다.

    • 프로토콜 스택은 내부에 타이머가 있어서 이것으로 일정 시간 이상이 경과하면 패킷을 송신한다.

2) 데이터가 클 때는 분할하여 보낸다

  • 송신 버퍼에 저장된 데이터가 MSS의 길이를 초과한다면, 다음 데이터를 기다리지 않는다.
  • 송신 버퍼에 들어있는 데이터를 맨 앞부터 차례대로 MSS의 크기에 맞게 분할한다.
  • 분할 된 조각은 한 개의 패킷에 넣어 송신한다.
    • 송신할 때, TCP 담당은 조각에 TCP 헤더를 부가한다.
    • 소켓에 기록되어있는 제어 정보(송신처 포트 번호, 수신처 포트 번호 등)를 바탕으로 IP 담당 부분에 건네주어 송신 동작을 실행한다.

3) ACK 번호를 사용하여 패킷이 도착했는지 확인한다.

시퀀스 번호와 ACK 번호로 패킷이 수신측에 도착한 것을 확인한다.

  • 시퀀스 번호
    • TCP 담당 부분은 데이터를 조각으로 분리할 때 조각이 통신 개시부터 따져서 몇 번째 바이트에 해당하는지 세어둔다.
    • 데이터의 조각을 송신할 때 세어둔 값을 TCP 헤더에 기록하는데, 시퀀스 번호 라는 항목이 해당된다.
  • 수신측은 패킷 전체의 길이에서 헤더를 빼면 데이터의 크기를 계산하여 산출할 수 있다.
  • 위 두 가지 방법(시퀀스, 데이터의 크기)으로 송신한 데이터가 몇 번째 바이트부터 시작되는 몇 바이트 분의 것인지 알 수 있다.
  • 수신측에서 패킷이 누락되었는지 확인할 수 있다.
    • 예시
      • 1,460 번째 바이트까지 수신이 완료한 상태에서 시퀀스 번호가 1,461이 도착하면 누락이 없다는 것을 알 수 있다.
      • 시퀀스 번호가 1461인 패킷이 도착하지 않았는데 2,921인 패킷이 도착하면 누락된 것을 확인할 수 있다.
  • ACK 번호
    • 누락이 없는 것을 확인하면 수신측은 데이터를 몇 번째 바이트까지 수신한 것인지 계산하고, 그 값을 TCP 헤더의 ACK 번호 에 기록하여 송신측에 알려준다.
    • 이 ACK 번호를 되돌려주는 동작을 수신 확인 응답이라고 부르며
    • 송신측은 이것으로 상대가 어디까지 수신했는지 파악한다.
  • 실제로 시퀀스는 이 예처럼 1부터 시작하지 않고 난수를 바탕으로 산출된 초기값으로 시작한다
    • 보안 문제 때문에 그렇다.
    • 접속 동작 부분에서 SYN이라는 제어 비트를 1로 하여 서버에 보내는 부분이 있었는데, 이 때 시퀀스 번호의 초기값도 같이 보낸다.

실제 움직임

  • 접속 동작
    1. 접속 동작 실 행할 때, 클라이언트가 시퀀스 번호 초기값을 서버측에 보낸다.
    2. 서버측은 받은 수신한 데이터에 대한 ACK 번호와 시퀀스 번호 초기값을 산출하여 클라이언트에 보낸다.
    3. 클라이언트는 수신한 데어터에 대한 ACK를 서버에 보낸다.
    4. 이로써 시퀀스 번호와 ACK 번호가 준비되었으므로 데이터 송수신 동작에 들어간다.
  • 송수신 동작
    1. 클라이언트가 데이터와 함께 시퀀스 번호를 보낸다.
    2. 서버는 받은 데이터의 크기를 계산하고 받은 시퀀스 번호를 이용하여 ACK 번호를 산출하여 보낸다.
    3. 서버는 클라이언트로 데이터를 보낼때는 위의 반대가 된다.
  • 이 구조는 매우 강력하다.
    • 수신측에 패킷이 올바르게 도착한 것을 확인하고, 도착하지 않으면 다시 보낸다.
    • 오류가 발생하더라도 전부 검출하여 회복 처리(패킷 재전송)를 할 수 있다.
    • 이로 인해 LAN 어댑터, 버퍼, 라우터 모두 회복 조치를 취하지 않는다.
    • 오류가 검출되면 패킷을 버리기만 한다.
  • 만약 케이블이 끊어져 TCP가 아무리 재전송을 해도 데이터가 도착하지 않는다면?
    • 몇 번 다시 보내고 회복의 전방이 없는 것으로 판단. 데이터 송신 동작을 강제로 종료 한다.

4) 패킷 평균 왕복 시간으로 ACK 번호의 대기 시간을 조정한다.

  • 타임 아웃
    • ACK 번호가 돌아오는 것을 기다리는 시간을 타임아웃 값 이라고 한다.
  • 타임 아웃 값이 길어지면 속도 저하의 원인이 되고
  • 타임 아웃 값이 짧아지면 소모적인 낭비가 된다.
  • 따라서 TCP는 동적으로 타임 아웃 값을 조절하게 된다.
    • ACK 번호가 돌아오는 시간을 기준으로 대기 시간을 판단한다.
    • ACK 번호가 늦게 들어오면 타임 아웃 값은 길어지고
    • ACK 번호가 빠르게 들어요면 타임 아웃 값은 짧아진다.

5) 윈도우 제어 방식으로 효율적으로 ACK 번호를 관리한다.

  • 한 개의 패킷을 보내고 ACK 번호를 기다릴때까지 아무것도 하지 않고 기다리는 것인 시간 낭비다.
  • 이 낭비를 줄이기 위하여 윈도우 제어 라는 방식을 사용한다.
    • 윈도우 제어
      • 한 개의 패킷을 보낸후 ACK 번호를 기다리지 않고 차례대로 연속해서 복수의 패킷을 보내는 방법이다.
      • ACK 번호가 돌아올 때까지 시간이 낭비되지 않는다.
  • 윈도우 제어로 연속으로 데이터를 보내면, 수신측의 능력을 초과하여 패킷을 보내는 사태가 일어날 수 있다.
    • 위 문제를 피하는 방법
      • 수신측에서 송신측에 수신 가능한 데이터 양(윈도우 사이즈)를 TCP 헤더의 윈도우 필드를 통해 통지한다.
      • 송신측은 이 양을 초과하지 않도록 송신 동작을 실행한다.

6) ACK 번호와 윈도우를 합승한다.

  • 윈도우 통지의 동작은 언제 일어날까?
    • 수신측이 수신 버퍼의 데이터를 애플리케이션에 건내주었을 때
      • 윈도우 통지의 타이밍이다.
  • ACK 번호는 수신측에서 데이터를 받았을 때 내용을 조사하여 정상 수신을 확인할 수 있는 경우에만 송신측에 보낸다.
  • ACK 번호와 윈도우 통지를 패킷을 따로 보내는 것은 비효율적이다.
    • 패킷이 많아저서 효율성이 저하된다.
  • 수신측은 ACK 번호나 윈도우를 통지할 때 소켓을 바로 보내지 않고 잠시 기다렸다가 다음 통지 동작이 일어나면 양쪽을 상승시켜 한 개의 패킷으로 묶어서 보낸다.
    • 매번 ACK를 보내지 않고 수신한 데이터들의 끝에 대한 ACK 번호만 통지하고 도중의 것은 생략한다.

7) HTTP 응답 메시지를 수신한다.

  1. 브라우저는 리퀘스트 메시지를 송신해달라고 의뢰한다.
  2. 클라이언트는 응답 메시지를 받기 위해 read 프로그램을 호출한다.
  3. read를 경유하여 프로토콜 스택에 제어가 넘어가고 프로토콜 스택이 움직인다.
  4. 프로토콜 스택은 수신 버퍼에서 데이터를 추출하여 어플리케이션에 전달해준다.
    1. 수신한 데이터 조각과 TCP 헤더의 내용을 조사하여 데이터 누락을 검사한다.
    2. 문제가 없으면 ACK를 반송한다.
    3. 그리고 데이터 조각을 수신 버퍼에 일시 보관한다.
    4. 조각을 연결하여 원래의 데이터로 복원하고 애플리케이션에 전달한다.

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

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

1.연결을 끊기 원하는 쪽이 (Server든 Client든) Socket 라이브러리의 Close 호출 2.연결을 끊는 프로토콜 스택에서 TCP 헤더를 만들고, 연결 끊기를 나타내는 정보를 설정.

  • 구체적으로는 컨트롤 비트의 FIN 비트에 1을 설정하고 IP 담당부분에 의뢰하여 클라이언트에 송신해 달라고 함. 3.연결을 끊기는 쪽은 read를 호출하면서 반대쪽에서 연결을 끊는다는 사실을 알게되고, 이를 알았다는 신호를 보냄.
  1. 그러고나서 연결을 끊기는 쪽은 close를 하게 되고, FIN 비트에 1을 설정한 TCP 헤더를 만들어 IP 담당 부분에 의뢰하여 반대편에 송신한 후
  2. 반대편에서 ACK이 돌아오면 대화를 끝낸다.

2) 소켓을 말소한다.

소켓은 필요 없지만, 거기서 바로 소켓을 말소하지 않고 잠시 기다린 후 소켓을 말소한다.

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

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

1) 패킷의 기본

  • 패킷 = 헤더 + 데이터 // 헤더는 제어정보
  • TCP/IP의 패킷 = MAC 헤더 + IP 헤더 + TCP 헤더 + 데이터 조각
  • 라우터에 할당된 이더넷의 주소(MAC 주소)를 조사하고, 그것을 MAC 헤더에 기록한다. 참고로, 허브에는 패킷의 목적지를 판단하기 위한 표(이더넷용 표)와 같은 것이 있어서 이더넷의 헤더의 수신처 정보와 표를 결합해서 패킷의 목적지를 판단하여 중계한다.

2) 패킷 송/수신 동작의 개요

패킷 송/수신 동작의 출발점은 TCP 담당 부분이 IP 담당 부분에 패킷 송신을 의뢰하는 곳부터 시작한다. 의뢰 동작을 할 때 TCP 담당 부분은 데이터의 조각에 TCP 헤더를 부가한 것을 IP 담당부분에게 건내주고, 동시에 상대의 IP주소를 건네준다. 즉, '이 상대에게 내용물을 전달해 주세요.' 라고 의뢰한다고 생각하면됨.

그리고 의뢰를 받은 IP 담당부분은 해당 내용물에 IP 헤더(최종목적지)와 MAC 헤더(다음목적지)라는 도 개의 헤더 태그를 붙여준다. 그리고 MAC 헤더는 이더넷 등의 LAN을 사용하여 가장 가까운 라우터까지 패킷을 운반할 때 사용하는 제어정보를 기록한다.

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

IP 헤더의 수신처 IP 주소에는 통신 상대의 주소를 설정한다. 송신처 IP 주소는 송신처가 되는 LAN 어댑터를 판단하여 주소를 설정한다.패킷을 건내줄 상대를 판단하는 방법은 라우터가 IP용 표(경로표)를 사용하여 다음 라우터를 경정하는 동작과 같다.

기본적으로, shell에서 route print 명령어를 사용하면, Network Destination, Netmask, Gateway, Interface, Metric 이라는 총 5개의 속성이 보인다. 여기에서 Interface는 LAN 어댑터 등의 네트워크용 인터페이스를 나타내고, 인터페이스에서 패킷을 송신하면 상대에 패킷을 전해줄 수 있다는 의미다. 또한 Gateway는 다음 라우터의 IP 주소이다. 또한 경로표의 맨 위 행에는 목적지와 넷마스크가 0.0.0.0으로 등록되어있는데, 이것은 소위 기본 게이트웨이를 나타내며, 다른 곳에 일치하는 것이 없으면 이 행이 해당하는 것으로 간주한다. 그리고 마지막의 Metric은 이 경로를 사용하여 패킷을 운반한 경우의 비용을 나타낸다. 이 값이 작은 쪽이 지름길이다.

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

MAC 헤더에는 '수신처 MAC 주소', '송신처 MAC 주소', 'Ether Type'이 기록되며, EtherType은 IP 프로토콜, ARP 프로토콜, 0800, 0806 등으로 구성되어있다. IP 주소와의 차이점은 IP 주소는 32비트를, MAC 주소는 48 비트를 사용한다.

MAC 주소는 LAN 어댑터를 제조할 때, 그 안에 있는 ROM에 기록되므로 여기에 기록되어있는 값을 읽어와서 MAC헤더로 설정한다.

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

여기에서 사용하는 것이 ARP인데, ARP의 개념은 간단하다. 이더넷에는 연결되어 있는 전원에게 패킷을 전달하는 브로드캐스트라는 구조가 있으며, 이 구조를 이용하여 "ㅇㅇ라는 IP 주소를 가진 분 있습니까?" 라고 전원에게 질문한다. 그러면 해당자는 "저요! 제 MAC 주소는 xxxx입니다." 라는 식의 응답이 돌아온다.

하지만 패킷을 보낼때마다 이 동작을 하면 ARP의 패킷이 불어나기 때문에 한 번 조사한 결과는 ARP 캐시 라는 메모리 영역에 보존하여 다시 이용한다. 즉 패킷을 송신할 때 우선 ARP 캐시를 조사하여 거기에 상대의 MAC 주소가 저장되어 있으면 ARP를 조회하지 않고 ARP 캐시에 보존되어 있는 값을 사용한다. 그리고 ARP 캐시에 저장되어 있지 않은 경우에만 ARP를 조회한다. 또한, ARP 캐시는 항상 저장하고 있으면 문제가 될 수 있으므로 제한시간을 두어 캐시를 삭제한다.

 이를테면, IP 호스트 A가 IP 호스트 B에게 IP 패킷을 전송하려고 할 때 IP 호스트 B의 물리적 네트워크 주소를 모른다면, 
ARP 프로토콜을 사용하여 목적지 IP 주소 B와 브로드캐스팅 물리적 네트워크 주소 FFFFFFFFFFFF를 가지는 ARP 패킷을 네트워크 상에
전송합니다. IP 호스트 B는 자신의 IP 주소가 목적지에 있는 ARP 패킷을 수신하면 자신의 물리적 네트워크 주소를 A에게 응답하게 됩니다. 

 이와 같은 방식으로 수집된 IP 주소와 이에 해당하는 물리적 네트워크 주소 정보는, 각 IP 호스트의 ARP 캐시라 불리는 메모리에 
테이블 형태로 저장된 다음, 패킷을 전송할 때에 다시 사용됩니다. 

 ARP와는 반대로, IP 호스트가 자신의 물리 네트워크 주소는 알지만
IP 주소를 모르는 경우, 서버로부터 IP주소를 요청하기 위해 RARP를 사용하게 됩니다.

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

LAN 어댑터가 디지털 데이터를 전기나 빛의 신호로 변환하여 네트워크의 케이블에 송출하며, 이것이 송수신 동작의 본질이라고 할 수 있다.

LAN 어댑터의 ROM에는 전 세계적으로 중복되지 않도록 일원화해서 관리하는 MAC 주소를 제조할 때 기록하므로 이것을 읽어와서 MAC 회로에 설정한다. LAN 어댑터에 기록된 MAC 주소는 LAN 드라이버가 MAC 회로에 설정한다.

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

이제 패킷을 전기신호로 변환하여 실제로 케이블에 송출하는 장면으로 넘어간다. LAN 드라이버는 IP 담당 부분에서 패킷을 받으면 그것을 LAN 어댑터의 버퍼 메모리에 복사한다. 복사를 마친 후 패킷을 송신하도록 MAC 회로에 명령을 보내면 MAC 회로의 작업이 시작된다.

MAC 회로는 먼저 송신 패킷을 버퍼 메모리에서 추출하고 맨 앞에는 프리앰블과 스타트 프레임 딜리미터라는 두 개의 데이터를, 맨 끝에는 프레임 체크 시퀀스(FCS)라는 오류 검출용 데이터를 부각한다.

여기서 프리앰블은 송신하는 패킷을 읽을 때의 타이밍을 잡고, 스타트 프레임 딜리미터는 프레임의 시작위치를 발견한다. 또한 FCS를 통해 패킷을 운반하는 도중에 잡음 등의 영향으로 파형이 흐트러져 데이터가 변한 경우를 검출하기 위한 검사코드로 보면된다.

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

이제 드디어 신호를 송신하는 동작을 설명하는데, 이 동작에는 리피터 허브를 사용했을 때의 반이중 모드와 스위칭 허브를 사용한 전이중 모드의 두 가지가 있다.

반이중 모드의 동작은 신호의 충돌을 피하기 위해 다음과 같이 동작한다. 먼저 케이블에 다른 기기가 송신한 신호가 흐르고 있는지 조사하고, 신호가 흐르고 있으면 그것이 끝날 때까지 기다린다

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

UDP는 주로 제어용 통신 또는 음성이나 동영상 데이터를 보낼 때 사용한다.

⚠️ **GitHub.com Fallback** ⚠️