Network 계층을 통해서 Application, Transport 계층에서 배운 논리적인 데이터 송수신을 훨씬 구체적인 방법으로 알아보았습니다.
하지만 아직 추상화적인 부분이 남아있는데 바로 위의 그림에서 선으로 표현된 Link입니다. 실제로는 어떤 디바이스가 라우터까지 선으로 연결된것이 패킷은 전자기파 형태로 케이블에 실리게 됩니다. 마치 교실에서 여러명이 말을 하면 무슨 말인지 알아들을 수 없는 것처럼 이 과정에서 패킷끼리의 충돌로 인해 문제가 생길 수 있습니다. 결국 Media들을 어떻게 충돌이 나지 않도록 Access할껀지 Control해주는게 있어야하는데 이것을 줄여서 MAC Protocol이라고 합니다.
Application 계층은 메세지라는 전송 단위를 사용하고 사용자층에 구현
TCP(segment)와 IP는 운영체제에 구현
Link 계층은 운영체제와 네트워크 인터페이스 카드에 구현
Link 계층에서 가장 중요한 기능은 충돌(collision) 조절입니다. multiple access links, media access control은 위의 그림처럼 여러 Host들의 데이터가 공유된 환경에서 충돌이 나지 않도록 조절하는지에 대한 내용입니다.
이상적인 MAC protocol은 아래의 규칙을 따라야 합니다.
한명의 Host만 라우터에 접근한다면 전체 R(bandwidth)를 사용해야 한다.
여러명이 사용하고 싶다면 R/N씩 사용해야 한다.
분산화 되어야 한다.
단순해야 한다.
시간을 분할하여 각각 사용자에게 사용시간을 부여하는 방법
단점 : 매번 모든 사용자가 데이터를 보내는것이 아니기 때문에 낭비(빈 공간)이 발생할 수 있음.
주파수를 분류하여 사용한 방법.
단점 : TDMA와 같은 단점
partitioning의 큰 단점(내 시간이 되어야만 데이터 전송가능)을 보완하기 위해 사용자는 계속 데이터를 보내고 랜덤하게 access하는 방식을 사용한다. 하지만 충돌이 발생하기 때문에 충돌 탐색과 충돌 회복에 대한 대비를 해야한다.
사용자가 전송하고 싶은 데이터(프레임)이 있을때 전송을 하되 누가 이용하고 공유된 케이블(carrier)을 사용하고 있는지 확인해보는 방법입니다.
2번 컴퓨터가 carrier sense를 통해 현재 케이블을 사용하고 있는지 확인한다.
아무도 사용하고 있지 않기 때문에 프레임을 전송한다.(전자기파)
잠시 후 4번 컴퓨터가 carrier sense를 통해 확인한다.
2번 컴퓨터의 전자기파가 아직 도착하지 않았기 때문에 4번 컴퓨터도 프레임을 전송한다.
충돌 발생
전자기파의 속도 때문에 위와 같은 충돌이 발생합니다. 전자기파의 속도는 물리적으로 우리가 조절할 수 있는 방법이 없기 때문에 CSMA 방식을 사용했을때 충돌을 전부 피할 수 없습니다. CSMA는 충돌이 났을때 해결할 수 있는 방법으로 CSMA/CD(collision detection) 알고리즘을 사용합니다.
위의 상황 처럼 2번과 4번 컴퓨터가 충돌이 났다면 둘다 프레임 전송을 중지하고 재전송을 합니다. 여기서 재전송을 하기 위한 대기시간을 일정범위 안에서 랜덤하게 선택하게 되면 둘이 충돌이 나지 않습니다. 예를 들어, 2번은 1초 후 재전송을 하고 4번을 2초 후 재전송을 하는 상황입니다.
프레임 재전송은 시간의 범위가 좁으면 좁을수록 더 빠르게 데이터를 보낼 수 있습니다. 위의 예시는 현재 2개의 충돌을 가정했지만 실제로 수많은 프레임들의 충돌이 일어날 수 있게 되고 좁은 시간 범위안에서 랜덤하게 재전송을 하게 되면 또다시 충돌이 일어날 수 있습니다. 또한 각각의 프레임들은 충돌이 난 것을 알 수는 있지만 몇 개의 프레임들과 충돌이 난지는 알 수 없습니다.
CSMA/CD 알고리즘은 이 대기 시간의 범위를 0(사용자가 적다고 가정)부터 충돌이 일어나면 2, 4, 8 ...로 증가(사용자가 많다고 가정)시키는 binary (exponential) backoff를 사용합니다.
partitioning과 random access는 서로의 장단점이 분명한 프로토콜입니다. partitioning은 사용자가 많다면 시간 간격을 꽉채워서 사용할 수 있기 때문에 효율적이고 반대로 사용자가 적다면 random access가 더 효율적입니다.
taking turns는 이 두가지의 장점을 다 취하기 위한 방법입니다.
polling 방식은 각각의 노드들 관리할 수 있는 마스터 노드를 두고 마스터 노드가 하위 노드들에게 프레임 전송 여부를 묻고 전달 받는 방식을 사용합니다. 하지만 마스터 노드에 문제가 생긴다면 아무것도 할 수 없기 때문에 실제로 사용되고 있지는 않습니다.
토큰을 가지고 있는 노드만 프레임을 전송할 수 있는 방식입니다. 이 방식도 결국 토큰을 유실하거나 문제가 생긴다면 전체 시스템이 망가지기 때문에 사용하지 않습니다.
따라서 channel partitioning(lte)과 random access을 사용하게 되고 이더넷(유선)과 와이파이(무선)은 random access를 사용하고 있습니다.
이더넷은 지금까지 이야기한 유선 케이블 상황에서의 media access protocol 입니다.
과거에는 케이블에 구멍을 뚫어 연결하는 bus 방식을 사용했지만 현재에는 link 계층 장비인 스위치를 사용하여 이더넷이 구성되어 있습니다.
이더넷은 헤더와 데이터 CRC로 구성되어 있는데 CRC는 에러체킹을 위한 필드입니다. 가장 중요한건 address인데 여기서 말하는 address는 link 계층에서 사용하는 MAC address가 담기게 됩니다.
이더넷은 random access 방식의 CSMA/CD 프로토콜을 사용하고 동작 방식은 위의 설명과 동일합니다.
이더넷 상황에서 한국에 있는 프레임을 미국으로 보내기 위한 첫 단계는 첫번째 라우터로 프레임을 잘 전송하는 것이 목표입니다. CSMA/CD 프로토콜은 라우터가 피드백을 주지 않는데 잘 도착했는지 파악할 수 있을까요. 여기서 이더넷 상황이라는것은 결국 유선케이블을 사용하고 있다는 뜻이고 적어도 외부의 간섭이 없기 때문에 충돌만 일어나지 않는다면 잘 도착할 수 있습니다. 그렇기 때문에 이더넷의 CSMA/CD는 라우터의 피드백이 필요 없습니다.
결국 가장 중요한 것은 충돌 탐지(collision detection)입니다. 만약 충돌 탐지 확률이 98%라면 2%의 프레임은 그냥 사라지게 되고 라우터의 피드백도 없기 때문에 재전송도 할 수 없는 상황이 발생하여 무조건 100%로 충돌 탐지가 일어나야 합니다.
충돌이 발생하게 모든 프레임 전송을 취소하게 됩니다. 하지만 F의 프레임이 A에 도착하기 전에 A의 프레임 전송이 끝났다면 A는 충돌을 탐지하지 못하고 재전송을 하지 않는 상황이 발생합니다.
이 충돌 상황은 F의 프레임이 도착할 정도로 A의 프레임 사이즈가 조금만 더 컸다면 충돌을 감지할 수 있습니다. 따라서 이더넷의 CSMA/CD는 케이블의 길이를 고려해서 최소한의 프레임크기를 제한하고 있습니다. 만약 실제로 보낼 데이터가 최소환의 프레임 크기 보다 작다면 패딩을 두어 크기를 맞추는 방법을 사용하여 100% 충돌 탐지를 할 수 있습니다.
MAC 주소는 NIC(네트워크 인터페이스 카드)가 생산되는 순간 제조사에 고유한 번호를 찍기 때문에 머신에서 영원히 바뀌지 않는 주소입니다. MAC 주소는 48bit로 표현되기 때문에 16진수로 끊어서 표현합니다. 앞의 24bit는 제조사를 의미하고 뒤의 24bit는 제품의 일련번호를 의미하기 때문에 unique한 번호를 부여할 수 있습니다.
다음 게이트웨이의 MAC 주소(Next-Hop의 MAC 주소)를 알수 있게 해주는 역할 해주는 프로토콜이 ARP입니다.
ARP 프로토콜은 프레임의 프레임의 도착지와 IP주소의 도착지를 브로드캐스트하여 현재 이더넷에 있는 모든 기기에 데이터를 보내게 됩니다. 이때 DATA 부분에는 ARP query를 담아서 보내는데 이 안의 내용은 next-hop의 ip(1.1.1.1)정보를 담게 되고 ARP query에 적힌 IP주소에 해당하는 기기는 DATA 부분에 ARP response를 생성하고 프레임의 source에는 본인의 MAC 주소정보를 담아 보내게 됩니다. 이 정보를 받은 A는 ARP Table에 캐싱하게 됩니다. ARP 프로토콜을 구분해주기 위해 프레임의 type필드가 존재합니다.
프레임을 전달 받은 라우터는 프레임 데이터 부분에 있는 패킷을 다시 새로운 프레임으로 만들게 됩니다. 이때의 프레임 SRC는 현재 라우터의 MAC 주소이며 다음 라우터의 MAC주소가 담기게 됩니다. 여기서도 마찬가지로 다음 라우터의 MAC 주소를 찾기 위해 2번의 테이블 참조(포워딩 테이블에서 패킷에 적힌 목적지 IP에 해당하는 Next-hop IP 참조, ARP 프로토콜을 통해 Next-hop MAC 주소를 구하고 ARP table을 참조)하게 됩니다.
결국 패킷의 주소 정보는 변하지 않고 오로지 TTL(Time to Live, 이동할수록 1씩감소)과 프레임의 MAC주소만 변하면서 데이터가 전달됩니다.
과거와 다르게 현재는 스위치라는 장비를 사용하고 있습니다. 스위치라는 장비를 사용하게 되면 호스트 입장에서는 carrier sense를 할때마다 매번 아무 신호도 없다고 판단하고 데이터를 전송하게 되고 스위치가 이 신호들을 관리해주는 역할을 합니다.
스위치를 사용하고 나서 부터는 분리된 브로드캐스트가 가능하여 A -> A'과 B -> B'의 프레임 전송이 동시에 일어날 수 있게 되었습니다.
스위치는 A의 프레임을 4번 인터페이스로 할당하기 위해 스위치 테이블을 사용하게 됩니다.
A가 보낸 프레임을 받은 스위치는 적어도 A가 1번 인터페이스에 있다는 정보를 학습할 수 있습니다.
만약 스위치 테이블의 A'에 대한 정보가 없는 경우 : 모든 인터페이스로 프레임을 전송(flood)
A'이 프레임을 보낸 적이 있어 스위치 테이블에 정보 있는 경우 : 스위치 테이블 참조로 바로 전송
스위치는 보통 16개의 연결할 수 있는 포트를 가지고 있기 때문에 스위치와 스위치끼리의 연결을 통해 충분한 이더넷 크기를 만들게 되고 이런 구조에서 역시 self-learning을 통해 프레임을 주고 받습니다.
DHCP(UDP사용)를 통해 자신의 IP주소를 할당받고 DNS, Gateway router IP 주소를 검색하여 포워딩 테이블에 저장
IP 패킷의 SRC 주소 : 0.0.0.0
, DEST 주소 : 255.255.255.255
이더넷 통신을 위한 SRC MAC 주소 : 내 MAC 주소
, DEST 주소 : FF.FF.FF.FF.FF.FF
DHCP 통신을 통해 스위치 테이블 self-learning
HTTP 요청을 보내기 위한 작업
목적지를 알기 위한 DNS 쿼리 (UDP 사용)
IP 패킷의 SRC 주소 : 내 IP 주소
, DEST 주소 : DNS서버 IP 주소
포워딩 테이블 룩업이 일어나서 next-hop은 gateway router가 됨
HTTP 요청