이더넷
- 이더넷은 본래 네트워크에 연결된 모든 기기에 신호를 보내며 신호의 맨 앞 부분에 수신처를 표시하여 이 신호를 받을 대상이 이를 처리할 수 있도록 한다.
- MAC 헤더가 이 수신처를 표시하는 방법으로 사용된다.
- 현재는 스위칭 허브가 MAC 헤더를 확인하여 원하는 수신 기기에만 패킷을 전달한다.
LAN 어댑터
- 디지털 데이터를 빛의 신호로 변환하여 네트워크 케이블에 송출하는 역할
- LAN 어댑터 구조
- 버퍼 메모리: 송, 수신 패킷을 잠시 저장
- ROM: MAC 주소를 기입한다.
- MAC: 송, 수신 동작을 제어한다.
- PHY: 신호를 송신하는 회로와 수신하는 회로를 합친 것
- RJ-45 커넥터: LAN 케이블을 접속하는 커넥터
MAC
- LAN 어댑터는 전원이 들어오면 초기화 작업이 필요하다. 이 작업은 MAC 회로에 MAC 주소를 설정하는 것이 포함된다.
- MAC 주소는 전 세계적으로 일원화 되어 어댑터마다 고유한 값을 가진다. 이 값은 ROM에 기록되어 있으며 초기화될 때 이 ROM에서 값을 읽어와 MAC 회로에 주소를 설정한다.
- 위와 같은 초기화 작업은 LAN Driver에 의해 이뤄진다.
MAC회로의 작업
- LAN 드라이버는 패킷을 버퍼 메모리에 복사하고 MAC 회로에 패킷을 송신하도록 명령한다.
- MAC 회로는 패킷의 앞에 프리앰블과 스타트 프레임 딜리미터라는 2개의 데이터와 프레임 체크 시퀀스(FCS)라는 오류 검출용 데이터를 부가한다.
프리앰블과 스타트 프레임 딜리미터
- 패킷이 언제 개시되는지 알려주기 위한 파형을 그리기 위해 존재
- 프리앰블은 1010…10(56비트)로만 이루어져 있으며 일정한 파형을 그린다.
- 스타트 프레임 딜리미터는 10101011(8비트)로 이루어져 있으며 1011을 읽는 순간 파형이 변하면서 패킷이 개시됨을 알리는 역할을 한다.
데이터 신호와 클럭
- 디지털 데이터는 0과 1의 값을 갖는 비트로 구성되어 있고 이는 각각 전압이나 전류에 대응되어 전기 신호로 변환할 수 있다.
- 그런데 0 또는 1 값이 지속적으로 이어지면 변화가 없어 이를 구분하기 어렵다. 그래서 클럭 신호와 합성하여 몇개의 비트로 구성되어 있는지 확인할 수 있다.
- 1은 위에서 아래로 낮아지는 파형, 0은 아래에서 위로 높아지는 파형으로 구분하는 등의 방법을 통해 데이터 신호를 클럭과 합성하여 전기신호로 온전히 변환하고 해석할 수 있다.
FCS
- 패킷 끝에 부가되는 FCS는 패킷을 운반하는 도중 잡음 등의 영향으로 파형이 흐트러져 데이터가 변한 경우 이것을 검출하기 위해 사용한다.
- 32비트의 비트열로 패킷 전체를 특정한 계산식으로 계산한 것이다. 데이터가 변하면 이 값과 다른 값이 되기 때문에 데이터 변형을 검출할 수 있다.
신호를 송신하는 방법
전이중 모드
- 신호 충돌을 피하기 위해 케이블에 다른 기기가 송신한 신호가 흐르는 지 조사한 후 신호가 흐르고 있으면 대기한다.
- MAC 회로가 프리앰블의 맨 앞부터 1비트씩 차례로 디지털 데이터를 전기 신호로 변환한 후, PHY 혹은 MAU라 불리는 송, 수신 신호 부분에 보낸다.
- 전기 신호로 변환하는 속도가 전송 속도이다.
- MAC 회로는 어떤 형식으로든 변환할 수 있는 공통 형식의 신호를 PHY(MAU) 회로에 보낸다.
- PHY(MAU) 회로는 케이블의 종류나 전송 속도에 따라 받은 신호를 특정 형식의 신호로 변환한다.
- 송신 오류는 프로토콜 스택의 TCP가 검출하므로 신호 송신 시에는 확인하지 않는다.
- 신호 송신이 완료되기 전에 다른 기기로부터 신호가 들어오는 경우에 리피터 허브를 사용한 전이중모드에서 이러한 상황에서 신호가 뒤섞여 분간할 수 없는 충돌 상태가 된다.
- 충돌 상태가 되면 송신을 중지하고 다른 기기에 충돌 상황을 재밍 신호를 통해 알린다. 이후 잠시 대기 후에 송신을 다시 시도한다. 이 때 충돌을 일으킨 기기와의 대기 시간은 다르게 설계되어 같은 기기와 재충돌이 일어나지 않도록 설계되어 있다.
- 구체적으로는 MAC 주소를 바탕으로 난수를 생성하고 대기 시간을 계산한다.
- 충돌할 때마다 대기 시간을 2배로 늘려서 재 송신을 시도하고 10번째 이후로는 오류로 판단한다.
수신 통지
- 패킷을 수신한 후 수신처 MAC 주소가 현재 주소와 같다면 버퍼 메모리에 저장하고 인터럽트를 통해 이를 처리해줄 CPU를 호출한다.
- 인터럽트에는 번호가 있고 이는 현재 PnP 사양에 따라 번호가 자동으로 설정된다.
- 인터럽트에 의해 LAN 드라이버가 동작하고 버퍼 메모리에서 수신한 패킷을 추출하고 MAC 헤더의 타입 필드 값으로 프로토콜을 판별한다.
수신 오류
- LAN 드라이버가 패킷 타입을 확인하고 0800이면 TCP/IP 프로토콜에 패킷을 건넨다.
- IP 담당은 IP 헤더를 조사하여 포맷에 문제가 없는지 확인하고 수신처 IP 주소를 조사하여 일치하면 패킷을 수신한다.
- 일치하지 않을 경우 클라이언트 PC는 패킷을 중계하지 않기 때문에 오류가 발생한 것으로 판단하여 ICMP라는 메세지를 사용하여 상대에게 오류를 통지한다.
조각 나누기
- IP 프로토콜에 존재하는 방식
- 패킷을 운반하는 도중 통신 회선이나 LAN 중에는 짧은 패킷만 다룰 수 있는 것이 존재한다.
- 이 때문에 패킷을 여러개로 분할하는 경우가 있다. 이는 플래그로 표시되며 이런 표시가 된 패킷은 IP 담당 내부 메모리에 일시 저장하고 같은 IP 헤더의 ID 정보가 같은 패킷이 도착할 때까지 대기한다.
- 프래그먼트 오프셋에 각 프래그먼트의 본래 위치가 표시되어 있고 이에 따라 패킷을 원래 모습으로 재구성하는 리어셈블링 과정을 거쳐 패킷을 복원한다.
- 이후 TCP 담당 부분으로 전달한 후 IP 헤더에 저장된 수신처 IP 주소, 송신처 IP 주소, TCP 헤더에 기록된 수신처 포트 및 송신처 포트 번호로 소켓을 검색한다.
UDP
- TCP는 데이터를 확실하면서 효율적으로 전달하기 때문에 복잡하다.
- 누락 시 어떤 데이터가 누락됐는지 확인하고 그 부분의 데이터만 재전송
- UDP는 데이터를 전체 전송하고 도착을 확인한 후 누락 시에 다시 전체를 전송한다.
- 패킷을 짧게 하여 이 과정을 효율적으로 만든다.
- 패킷 하나가 ‘전체’이기 때문에 도착이 확인되지 않으면 패킷 하나를 재전송하면 된다.
송,수신
- TCP와 같은 수신 확인이나 윈도우가 없기 때문에 데이터 송,수신 전에 제어 정보를 주고 받는 과정이 없으며 접속이나 연결 끊기 단계가 없다.
- 애플리케이션으로부터 송신 데이터를 받아 UDP 헤더를 부가하고 IP에 의뢰하여 송신한다.
- IP 헤더에 기록된 수신처 IP 주소와 송신처 IP 주소, 그리고 UDP 헤더에 기록된 수신처 포트 번호와 송신처 포트번호를 통해 애플리케이션에게 데이터를 건네줌으로써 수신이 완료된다.
- 오류가 발생 시 회답이 돌아오지 않으므로 애플리케이션은 송신 동작을 한번 더 수행한다.
- 주로 음악, 영상 등의 미디어 컨텐츠 데이터를 전송할 때 사용된다.
- 원활한 재생을 위해 빠른 데이터 전송이 필요하기 때문이다.