생성된 패킷은 가까운 중계 장치로 가게 된다. 중계 장치는 수신처의 위치를 알 수 있는 표가 있기 때문에 이 표와 패킷의 헤더 안에 있는 수신처를 비교한다. 이를 통해 패킷은 다음 중계 장치로 가게 된다.
자세한 순서는 다음과 같다.
상대의 IP 주소는 애플리케이션 → TCP 담당 부분 → IP 담당 부분으로 IP 담당 부분에 전해져서 수신처 IP 주소에 기록된다.
송신처 IP 주소는 LAN 어댑터에 할당된 IP 주소가 기록된다. 그러나 여러 개의 LAN 어댑터가 있다면 각 LAN 어댑터에는 서로 다른 IP 주소가 할당되어 있기 때문에 어느 것을 사용할지 정해야 한다.
IP 당당 부분은 IP 헤더 앞에 MAC 헤더를 붙인다. MAC 헤더에는 수신처 MAC 주소, 송신처 MAC 주소, 이더 타입(Ether Type)이 기록된다.
송신처 MAC 주소는 자체의 LAN 어댑터의 MAC 주소이다.
수신처 MAC 주소는 다음으로 가는 라우터의 MAC 주소인데, 이 주소는 ARP로 조사한다.
이더 타입은 사용하는 프로토콜의 종류를 나타낸다.
ARP는 Address Resolution Protocol로 수신처 라우터의 MAC 주소를 조사할 때 사용한다.
연결되어 있는 모두에게 패킷을 전달하는 브로드캐스트를 이용하여 상대 IP 주소를 가지고 있는지 물어본다. 그러면 가지고 있는 라우터가 자체의 MAC 주소를 보내온다.
ARP 패킷이 너무 많아지는 것을 방지하기 위해 조사한 MAC 주소를 ARP 캐시(메모리 영역)에 몇 분정도 보존한다. 그래서 ARP를 조회하기 전에 ARP 캐시를 먼저 조사하여 MAC 주소가 저장되어 있는지 확인한다.
이렇게 알게된 MAC 주소를 MAC 헤더에 기록하고, MAC 헤더를 IP 헤더의 앞에 붙여 패킷을 완성시킨다.
이더넷의 원형은 그림의 (a)와 같다. 트랜시버는 신호를 흘려 케이블과 같은 역할을 한다. 신호를 송신하면 연결된 모두에게 신호가 전달한다. 신호를 받은 기기에서 헤더부분의 수신처 주소를 보고 자신의 주소가 아니면 패킷을 폐기한다.
이더넷의 원형이 (a)에서 (b)의 모습으로 변했다. 트렁크 케이블이 리피터 허브로 바뀌고, 트랜시버 케이블이 트위스트 페어 케이블로 바뀌었다. 그러나 신호를 모두에게 전달한다는 성질은 바뀌지 않았다.
(b)에서 (c)로 바뀌면서 스위칭 허브로 바뀌었다. 스위칭 허브는 연결된 무두에게 신호를 보내지 않는다. 스위칭 허브에서 수신처의 MAC 주소를 확인해 패킷을 목적지에만 전달한다.
IP 담당 부분이 디지털 데이터 형태의 패킷을 LAN 어댑터에 전달하면 LAN 어댑터에서 전기나 빛의 신호로 변환한다.
LAN 어댑터를 제어하려면 LAN 드라이버 소프트웨어가 필요하다. OS를 시동할 때 LAN 드라이버는 하드웨어 이상 검사, 초기 설정 등의 초기화 작업과 MAC 회로에 MAC 주소 설정을해야한다. MAC 주소는 LAN 어댑터의 ROM에 기록되어 있다.
LAN 어댑터는 IP 담당 부분에서 받은 패킷을 LAN 어댑터의 버퍼 메모리에 복사하고, MAC 회로에 패킷 송신을 명령한다.
MAC 회로는 버퍼 메모리에서 패킷을 가져와 패킷의 맨 앞에 프리앰블과 스타트 프레임 딜리미터 두 개의 데이터를 추가한다. 그리고 패킷의 맨 뒤에 프레임 체크 시퀀스(FCS)를 추가한다.
프리앰블은 송신하는 패킷을 읽을 때 타이밍을 잡기 위한 것으로, 비트 1과 0이 번갈아 나열되어 있다. 프리앰블에 이어지는 스타트 프레임 딜리미터는 비트 패턴이 다르다.
디지털 데이터를 전기 신호로 나타낼 때는 전류의 값에 대응시킨다.
신호에서 데이터를 읽을 때는 반대로 대응시키면 되는데, 이때 비트의 구분을 판단하면서 읽어야 한다.
클록 신호가 아래에서 위로 변화할 때 0과 1로 대응시키면 된다. 그러나 케이블이 길어지면 데이터 신호와 클록 신호가 전달되는 시간이 달라져서 클록이 달라진다. 이 문제를 클록 신호와 데이터 신호를 합성해 한 개의 신호로 만들면 해결할 수 있다.
클록 신호의 타이밍을 잡기 위해 패킷 앞에 추가한 것이 프리앰블이다. 수신측에서는 프리앰블 다음에 나오는 스타트 프레임 딜리미터의 신호 다음 비트부터 디지털 데이터로 변환한다.
끝에 추가된 프레임 체크 시퀀스(FCS)는 파형이 흐트러져 데이터가 변했는지 알 수 있게 해준다. 패킷의 맨 앞부분에서 맨 끝까지의 내용을 계산식으로 계산하여 나타낸 것인데, 1비트라도 변화하면 계산 결과가 달라진다. 그래서 수신측에서 계산한 FCS가 송신할 때 계산한 것과 다른 값이 나온다면 데이터가 변화했다는 것이다.
송신 동작을 할 때 리피터 허브를 사용하는 반이중 모드와 스위칭 허브를 사용하는 전이중 모드 두 가지가 있다. 반이중 모드는 송신과 수신 동작 중 한쪽만 가능하고, 전이중 모드는 송신과 수신 동작을 동시에 할 수 있다.
반이중 모드 송신 동작
컴퓨터 본체는 다른 작업을 실행하고 있기 때문에 패킷이 도착한지 모른다. 이때 컴퓨터 본체를 LAN 어댑터 쪽에 주의시키는 것이 인터럽트이다.
TCP는 데이터를 확실히 전달하기 위해 도착한 것을 확인하고, 도착하지 않았으면 다시 보내야한다. 또한, 어디까지 도착했고 어디부터 보내야 하는지 등을 생각해야한다.
그러나 UDP의 경우 패킷이 한 개밖에 없다면 데이터를 전부 다시 보내도 낭비가 아니기 때문에 괜찮다. 그리고 데이터를 보내면 회신이 돌아오므로 수신 확인 응답 패킷도 필요하지 않다. DNS 서버에 IP 주소를 조회할 때도 UDP 프로토콜을 사용한다.
UDP는 TCP와 같은 수신 확인이나 윈도우가 없어서 데이터 송•수신 전에 제어 정보를 주고받을 필요가 없다. 그리고 접속이나 연결 끊기 단계가 없다.
애플리케이션에서 받은 송신 데이터 앞에 UDP 헤더를 추가하고 IP에 의뢰하여 송신한다.
수신할 때는 IP 헤더에 기록된 수신처 IP 주소, 송신처 IP 주소와 UDP 헤더에 기록된 수신처 포트 번호, 송신처 포트 번호 네 항목과 소켓에 기록된 정보를 결합해 상대에게 데이터를 건네준다.
오류가 발생해 패킷이 사라져도 신경쓰지 않는다. 응답이 돌아오지 않으면 애플리케이션이 데이터를 다시 보내기 때문이다.
음성과 영상 데이터를 보낼 때도 UDP를 사용한다. 음성과 영상은 데이터가 조금 없어도 치명적인 문제가 되지 않는다. 그리고 재생 타이밍이 맞지 않으면 중간에 끊긴 음이나 영상을 되돌릴 수 없기 때문에 데이터가 도착해도 쓸모가 없다.
이처럼 다시 보낼 필요가 없거나 다시 보내도 쓸모가 없으면 UDP로 데이터를 보내는 것이 더 효율적이다.
출처
성공과 실패를 결정하는 1%의 네트워크 원리