다음 그림에서 보면 a노드가 이제 링크 레이어 프레임을 b한테 보내려고 하는 시나리오입니다.
그래서 여기 에 노드가 같은 서브넷 안에 있는 b한테 이제 프레임을 보내려고 해요.
그럴 때 a는 프레임 destination으로 이제 b의 맥 주소를 적어서 보내야 되겠죠.
그렇지 않으면은 이 노드가 메시지를 수락하지 않겠죠.
그리고 b의 경우에는 만약에 이 프레임을 받으면은 1차적으로 이 링크 레이어 주소 맥 주소를 보고서 만약에 내 것이 맞다라고 하면 이제 상위 레이어인 이제 네트워크 레이어로 올려보내줄 겁니다.
그리고 만약에 예를 들어서 이 c가 이 목적지 맥주소가 b인 요소로 돼 있는 걸 받았다면, 내 것이 아니니까 discard 하게 될 겁니다.
BROADCAST ADDRESS
맥주소에서는 특정 destination 맥주소를 쓰기도 하지만 특별한 목적으로 이 브로드캐스트 어드레스가 정의가 돼 있는데요.
broadcast address는 다음과 같이 모든 것이 1로 처리된 주소를 말합니다.
예를 들어서 DHCP(Dynamic Host Configuration Protocol, IP주소를 자동으로 할당해줌) 메시지를 보낼 때는 우리가 destination의 ip 주소도 모르고 목적지의 맥 주소도 모르는 상태이기 때문에 누구나 다 수신할 수 있는 즉 discard 하지 않고 누구나 다 이제 수신할 수 있는 메시지를 보낼 때 사용하는 주소를 이제 mac broadcast adress라고 합니다.
그래서 다음 그림에서와 같이 이제 링크 레이어는 ip 주소를 맥 주소로 encapsulation 하게 됩니다.
여기 그림에서 같이 IP packet, ip source address와 destination address가 헤더로 붙어 있는 ip packet을 맥 주소 맥 source와 맥 destination 주소 헤더가 붙은 이걸로 감싸준다는 거죠.
Q. 그렇다면 상대방의 맥주소는 어떻게 알아낼까요?
상대방의 ip 주소만 내가 알고 있어요. 그렇다면, 상대방의 맥 주소는 어떻게 알아낼 수 있을까요?
상대방의 맥주소를 알아오는 프로토콜로 ARP: address resolution protocol 가 정의가 돼 있습니다.
ARP는 ip 주소를 통해서 맥 주소를 알아내주는 프로토콜이다.
즉, ARP 테이블이라는 것을 만들어야 된다는 말입니다. 그래서 이 LAN 안에 있는 각각의 ip 노드들은 ARP 테이블이라는 테이블에 가지고 있는데요. 이 arp 테이블의 구성을 보시죠.
Q. ARP 테이블의 구성
ARP 테이블은 ip 주소와 그에 대응되는 맥 주소 그리고 이 정보가 유효한 시간 ttl (time to live)라는 정보로 표시가 되게 됩니다.
그래서 이 매핑 테이블이 만들어지면은 이 ttl 시간만큼 이 정보를 유지하면서 계속 이제 전송에 사용하겠다는 거죠.
TTL (Time To Live): time after which address mapping will be forgotten (typically 20 min)
일반적으로는 20분으로 세팅이 되고요. 20분이 지나면은 expired 해서 이 정보를 지워버리겠다.
그래서 우리가 다음과 같이 arp 명령을 쓰게 되면은 이렇게 내가 관리하고 있는 ip 주소와 그에 대응되는 맥주소가 이렇게 쭉 리스트업이 돼서 나올 수가 있거든요. 이게 내가 실제로 관리하고 있는 arp 테이블 정보가 되겠습니다. 그래서 arp 프로토콜을 통해서 arp 테이블을 만드는 과정을 우리가 한번 살펴볼게요.
Q. ARP 테이블 만드는 과정
a가 datagram을 b한테 보내려고 합니다. 근데 지금 a는 아직 b의 맥주소는 모르는 상태입니다. a의 arp 테이블에 b의 맥 주소가 없다는 거예요.
그러면은 a는 먼저 arp 쿼리를 보냅니다. 이제 b의 ip 주소를 넣어가지고 보냅니다.
그래서 이 b의 아이피 주소를 갖고 있는 애의 맥주소는 뭐야라고 물어보는 브로드 캐스트 메일을 보냅니다.
즉 b의 ip 주소는 알지만 맥 주소는 모르는 상태이기 때문에 앞에서 말한 destination mac address로 broadcast address를 사용하겠다는 거예요. 그래서 이 브로드캐스트 address 사용하면은 모든 node가 이 메시지를 받을 수가 있고 그리고 이게 arp 쿼리라는 것을 인지하게 됩니다.
그럼 b는 이 arp 쿼리 packet에 자신의 ip 주소가 담겨 있다는 것을 보고 이제 a한테 자신의 맥주소를 알려주는 reply하게 됩니다.
그래서 a의 맥주소를 destination 주소로 해서 a한테 자신의 맥 주소를 알려주게 됩니다.
그래서 보면은 arp request 보면 이 알곤이라는 서버가 브로드캐스트 맥 주소를 활용해서 arp 리퀘스트를 보냅니다.
예를 들어서 128.143.71.1의 맥주소는 무엇이니라고 물어보는 거죠.
물어보는데 destination mac 주소를 현재 모르죠.
그러니까 broadcast를 하는 거예요.
브로드 캐스트를 했더니 이거는 arp 리퀘스트구나라는 것을 다들 알겠죠.
근데 거기에 담겨 있는 ip 주소가 자기 거랑 일치하는 애 일치하는 친구는 자신의 것이라는 걸 알고서 자신의 맥 주소를 리플라이 해주게 됩니다. 그래서 라우터 137이 arp 리플라이를 통해서 자신의 맥 주소를 적어서 보내주게 됩니다.
그래서 a는 전달받은 이제 맥 주소를 테이블에 기록을 합니다.
그래서 예를 들면은 b의 ip 주소는 원래 알고 있었고 137.196.7.88 그리고 걔의 맥 주소는 arp 리플라이를 통해서 얻게 됩니다.
그리고 ttl 밸류 20분 동안 이 정보를 기억을 하겠다.
그럼 20분 동안에는 이 정보가 keep이 되니까 계속 arp를 보낼 필요 없겠죠.
이 저장된 값을 통해서 다음부터는 b한테 보낼 일이 있으면 이 맥주소를 이제 적어가지고 보내주는 겁니다.
그리고 ttl이 지나면은 이제 expired 시킵니다.
arp는 plug-and-play 방식으로 여러분들이 다른 세팅을 할 필요 없이 자동적으로 동작되는 프로토콜입니다.
그래서 이 인터넷에서 자동으로 이 arp 기능을 지원하면서 맥 주소를 이제 얻어낼 수 있도록 지원을 합니다.
그래서 한번 지금 배운 과정을 잘 기억해서 한번 end to end로 데이터가 어떻게 전송되는지 한번 살펴보도록 하겠습니다.
지금 이 a라는 노드에서 b라는 노드로 데이터를 보내는 과정을 한번 나타내고 있는 그림인데요.
지금 각각의 it 주소랑 맥 주소가 적어져 있죠 그리고 중간에 라우터가 하나 있고요 그래서 이렇게가 이제 하나의 서브넷이죠.
이 예제는 이 맥 주소와 ip 주소가 어떻게 활용되는지를 다시 한 번 살펴볼 수 있는 굉장히 중요한 예시입니다.
그래서 먼저 a에서 지금 소스 주소로 자신의 ip 주소 그리고 목적지 주소로 b의 ip 주소를 적어가지고 ip packet 만듭니다.
그다음에 링크 레이어에서는 맥주소를 달아야 되잖아요.
이 a는 링크레이어 프레임으로 b의 맥주소가 아니라 이 R의 맥주소 ONE 합HOP의 이제 노드의 맥주소를 적어주는 겁니다.
만약에 이 a가 이 알의 맥주소가 아니라 비의 맥주소 적었으면 어떻게 될까요.
패킷을 디스카운드 시키겠죠. 주소가 자신의 주소가 아니니까 그렇기 때문에 항상 바로 맥주소로 적어서 보내야 됩니다.
그러면은 a는 이 r의 맥주소를 어떻게 알 수 있을까요.
arp 과정을 통해서 arp request & reply를 해가지고 바로 아래 맥주소 이거를 알아내는 거죠.
그래서 패킷을 보낸 후 맥주소 헤더는 필요 없죠.
이제 여기까지 오면 상위 레이어를 올리면은 이 헤더를 떼어내야 되겠죠.
그럼 라우터는 이 ip packet을 이제 다시 라우팅 해줘야 되겠죠. 그래서 이 output 포트로 통해서 다시 내보내줘야 될 겁니다.
그럼 여기서 이제 이 ip packet을 같은 서브넷에 있는 b한테 보내려고 그래요.
때문에 다음은 b의 맥주소를 붙여서 보내야 됩니다.
그럼 b의 맥주소는 어떻게 알아내죠 이거 역시도 arp 과정을 통해서 b의 맥주소를 알아낼 수가 있겠죠.
이렇게 보내면은 b 입장에서는 이제 링크 레이어에서 이건 나의 맥 주소네라고 알고 링크레이어 헤더를 떼어냅니다.
그리고 이 ip packet까지 받고 또 ip header도 떼어내고 transport를 해서 떼어내면은 결국에는 애플리케이션 데이터만 남게 되는 거죠.
Q. 링크의 2가지 타입
링크에서는 두 가지 타입의 링크가 존재하는데요.
먼저 가장 단순한 형태는 포인트 to 포인트 링크가 있을 수가 있겠습니다.
이 경우에는 두 개의 노드가 다음과 같이 직접 연결된 상황을 말을 하는 겁니다.
보다 일반적인 형태는 다음과 같이 이 링크 사이에서 여러 개의 노드들이 동시에 연결돼 있는 형태 이 경우가 보다 일반적인 경우라고 할 수가 있습니다.
예를 들면은 이렇게 버스 형태로 연결돼 있다든지 아니면은 무선 미디엄을 통해서 여러 노드들이 동일한 무선 링크를 쉐어한다든지
이런 상황에서는 이 shared wire 혹은 미디어에서 보내는 데이터가 브로드 캐스트에서 다른 사람 다른 노드에 영향을 미치게 됩니다.
즉 뭐냐면은 single 혹은 shared broadcast 채널 내에서 여러 개의 sending&receiving node가 연결돼서 존재한다는 거죠.
예를 들어보면은요 같은 공간에서 여러 사람들이 동시에 떠든다고 합시다 동시에 이야기를 해요.
만약에 칵테일 파티 같은 데서 그러면 아무래도 다른 사람의 목소리가 노이즈로 작용해서 원활한 커뮤니케이션이 잘 안 되겠죠.
마찬가지로 이렇게 동일한 링크를 공유하는 상태에서 여러 노드들이 동시에 데이터를 보내게 되면은 이 데이터 간의 충돌이 발생하고 이로 인해서 원활한 데이터 전송이 힘들게 됩니다.
그래서 이걸 막기 위해서 잘 조율을 해주는 절차가 필요한데요. 이러한 과정이 링크 레이어에서 담당하는 굉장히 중요한 기능이 되겠습니다.
조금 어려운 말로 말하면은 이제 multiple access 여러 개의 multiple node들이 동시에 액세스 하는 거를 조율해주는 기능이라고 할 수 있겠죠.
그래서 다음과 같이 여러 명이 동시에 대화를 하려고 합니다.
이때 대화가 원활하게 잘 되기 위해선 어떻게 해야 될까요.
누구나 이야기를 하고 싶겠죠. 근데 만약에 두 세 사람이 동시에 이야기를 한다면은 당연히 collision이 발생할 겁니다.
이거를 해결하는 방법으로는 발언권을 이렇게 발언권을 준다든지 이때는 사회자가 필요하겠죠.
이런 일종의 규칙이 필요할 겁니다 만약에 규칙 없이 누구나 다 누구나 대화를 하고 싶을 때 대화를 하게끔 하면은 원활한 대화가 안 될 겁니다.
마치 이렇게 규칙이 필요하거나 사회자가 필요한 것처럼 링클레어에서도 이러한 절차를 프로토콜화하는 게 필요한데요.
이게 바로 이제 Medium Access Control (MAC) protocol의 역할이 되겠습니다.
멀티플 엑세스 프로토콜은 single shared broadcast channel을 잘 활용하기 위한 방안을 정의하는 것이고요.
그래서 두 개 혹은 그 이상의 동시에 전송이 일어났을 때는 간섭이 일어나게 되고 이것을 우리가 collision이라고 하는데요.
노드가 동시에 여러 개의 시그널을 받게 되면은 이 여러 개의 시그널이 서로 섞여서 오기 때문에 내가 받고자 하는 데이터를 잘 복원하지 못하기 때문에 결국 데이터 손실이 일어나게 됩니다.
그렇기 때문에 이 Medium Access Control (MAC) protocol이 이런 문제를 해결하기 위해서 등장하게 됐고요.
이 맥 프로토콜은 distributed algorithm 입니다.
distributed algorithm(분산 알고리즘)이라는 거는 각각의 분산된 노드들이 마치 tcp 프로토콜처럼 각각의 노드들이 직접 알고리즘을 수행하면서 이 문제를 해결하도록 하는 알고리즘이라는 겁니다.
그래서 어떻게 노드들이 이러한 공유된 채널을 잘 쓸 수 있게끔 각각의 노드들이 동작하게끔 정의하느냐 나타냅니다.
그래서 예를 들면은 노드가 언제 전송하면은 최대한 이러한 collision을 피할 수 있을까에 대해서 정의를 할 수 있는 거죠.
그래서 이 맥 프로토콜에는 두 가지 타입이 있습니다.
첫 번째는 채널 파티셔닝 타입이 있고요 그리고 두 번째는 랜덤 액세스 타입이 있습니다.
이 채널 파이티셔닝 타임은 뭐냐면은 결국에는 이 채널을 셰어하는 거잖아요.
이 셰어하는 채널을 잘 쪼개서 서로 exclusive하게 사용하도록 만드는 겁니다.
이렇게 되면은 채널이라는 자원을 잘게 잘게 쪼개서 사용하기 때문에 서로 충돌이 나지 않겠죠.
그래서 이 채널을 쪼개는 방법은 두 가지 방식이 있는데요.
시간 축으로 쪼개서 채널을 나눠 쓸 수가 있고 아니면은 주파수 축에서 채널을 쪼개서 나눠 쓸 수가 있습니다.
하지만 이런 채널 파티셔닝 방법 어떻게 보면 단점이라고 하는 것은 이 시간을 파티셔링하거나 프리퀀시를 파티셔링 하게 되면은 이 타임이나 프리퀀시를 잘 감지하고 정해진 시간 슬랏을 쓸 수 있도록 디바이스들이 설계가 돼야 되는데 당연히 이 디바이스의 콤플렉스티가 굉장히 높아지는 단점이 있습니다.
그래서 조금 더 단순한 방식으로 채널을 사용하는 랜덤 액세스 방식이라는 프로토콜이 또 정의가 돼 있는데요.
이 랜덤 액세스 방식은 뭐냐면은 채널이 일단은 쪼개져 있지 않습니다.
그렇기 때문에 항상 이 쪼개지지 않은 채널 누구나 다 이제 사용하게 하는 거고요.
그 말은 뭐냐하면 당연히 동시에 이 채널에 접근했을 때는 collision이 발생합니다.
그렇기 때문에 어떻게 하면 이 collision을 최대한 좀 피할 수 있을까 그리고 collision이 만약에 발생하면은 이건 collision을 완전히 피할 수 있는 방식이 아니기 때문에 collision이 만약에 발생하면 어떻게 recover 할 수 있을까에 대해서 정리하는 방식이라고 할 수 있겠습니다.
즉 채널을 조금 더 효율적으로 쓰는 측면에서는 1번이 더 좋지만 이 1번은 훨씬 더 많은 콤플렉스를 요구하기 때문에 우리가 조금 더 이 셀룰라 망에서 기본적으로 많이 사용이 되고 있어요. 셀룰라 망 좀 더 고비용 통신 기술이죠.
4g 3g 5g와 같은 셀룰망에서 그리고 이런 랜덤 액세스 같은 경우는 보통 유선 같은 데서 굉장히 많이 사용이 되고 있습니다.
굉장히 프로토콜을 단순하게 설계를 할 수 있고 복잡도도 낮기 때문이죠.
그래서 먼저 채널 파티셔닝하는 맥 프로토콜에 대해서 먼저 이야기를 해볼게요.
Channel partitioning MAC protocols: TDMA
첫 번째 방식은 시간 축으로 채널을 파티셔닝 하는 겁니다.
그래서 이걸 조금 어려운 말로 TDMA라고도 하는데요.
그래서 시간을 쪼개서 여러 명이 접근할 수 있도록 해주자 이런 말이 되겠죠.
그래서 이 채널을 시간 단위로 쪼개가지고 각 스테이션들이 데이터를 보내는 타임 slot을 할당해 주는 겁니다.
그래서 각각의 스테이션 각각의 단말들 혹은 컴퓨터들은 자기가 실제로 데이터를 보낼 수 있는 아주 짧은 타임 slot을 할당받게 됩니다.
그래서 fixed length 고정된 단위의 타임 슬랏을 얻게 되고요 그러면 내 타임이 오면은 그때 내가 데이터를 보내게 됩니다.
그렇기 때문에 다른 노드들이랑 동시에 보내는 걸 막기 때문에 충돌을 피하겠죠.
하지만 이것도 완벽하지가 않은 게 노드들이 정확하게 동기화가 돼야 되고 노드들이 정확하게 동기화가 되지 않으면은 사실상 아무리 다른 슬랏을 할당해줘도 미묘하게 겹쳐가지고 노이즈로 간섭할 수가 있겠죠.
그래서 이런 부분들을 이런 부분들을 정교하게 제어하기 위한 여러 가지 기법들이 사실은 이 TDMA 방식에서 역시 필요하게 됩니다.
그리고 타임 슬랏을 할당받았지만 내가 보낼 데이터가 없어가지고 실제로는 보내지 않는 경우도 있겠죠.
이런 경우에는 이 슬랏이 이렇게 안 쓰는 상태로 비어지기 때문에 다른 유저가 이 슬랏을 못 쓰게 낭비되는 문제가 또 생기기도 합니다.
그래서 예를 들면은 6개의 스테이션이 있는 LAN 상황을 생각해 봅시다 예를 들어 와이파이에 6개의 모바일 디바이스가 붙어 있어요.
그러면 이 모바일 디바이스에게 각각의 타임 슬랏을 할당해줍니다.
그래서 1번은 자신이 할당받은 이 첫 번째 슬랏에서 데이터를 발생시키고요 3번이랑 4번도 역시 슬랏을 발생시킵니다.
그런데 나머지 2번 5번 6번은 이번에 이번 라운드 이거 각각 라운드에는 본인의 데이터가 없는 거예요.
그러니까 이 슬랏은 사용이 안 된 채로 그냥 남겨지게 되는 거죠.
그래서 이렇게 시간 단위로 쪼개서 데이터를 사용하는 방식이 이제 TDMA 방식이 되겠습니다.
Channel partitioning MAC protocols: FDMA
두 번째는 fdma 방식입니다. 우리가 신호를 발생시킬 때 이 신호의 주기를 이제 다르게 신호를 발생시킬 수가 있습니다.
그래서 다음과 같은 신호는 굉장히 줄기가 짧게 짧은 신호고요 이거는 굉장히 줄기가 긴 신호가 되겠죠.
이걸 우리가 frequency가 다르다라고 하는데요.
이렇게 신호의 주기를 다르게 함으로 인해서 나중에 내가 검출하고자 하는 주기의 신호만 뽑아낼 수가 있습니다.
즉 이렇게 주기가 다른 신호들이 동시에 전파가 되더라도 수신 단에서 나는 이 주기의 신호만 사용할 거야 그러면 이 주위의 신호만 쏙 뽑아가지고 내가 데이터를 보관할 수 있는 거예요.
그 말은 뭐냐면은 서로 다른 주파수로 발생되는 신호는 동일한 시간에 전파가 돼도 완벽하게 복원할 수 있다라는 이 명제가 성립한다는 거죠. 그렇기 때문에 이 fdma 방식은 바로 이거를 잘 활용해가지고 주파수 주파수 도메인을 나눠 쓰자라는 거는 어떻게 보면은 주파수가 아주 짧은 것부터 아주 긴 것까지 있다면은 서로 사용할 수 있는 주파수 대역을 할당해주는 겁니다.
그래서 각각의 스테이션은 자기가 할당받은 주파수 이에 맞는 신호를 발생시켜가지고 데이터를 보내는 겁니다.
그래서 각각의 채널 스펙트럼은 프리퀀시 밴드로 나눠지고 각각의 스테이션은 자신들이 사용할 수 있는 프리퀀시 밴드의 신호를 발생시킵니다.
그러면은 예를 들어서 1번은 다음 같은 주파수 신호로 데이터를 발생시키고 2번은 조금 더 긴 신호로 발생 이걸 좀 과장해서 이야기를 하는 거예요. 이게 3번은 4번은 더 넓은 신호를 발생시키고 이런 식으로 할당된 주파수 대역 신호를 쓰게 되면은 1번 동시에 이 신호가 전파가 되더라도 원하는 신호를 보완할 수가 있다라는 거예요.
하지만 이 경우에도 역시나 이렇게 이 주파수를 할당받았음에도 안 사용하는 노드들이 있으면은 이 주파수 애형은 낭비가 되게 됩니다.
그래서 다음과 같이 이 주파수 대역을 나눠 쓴다라는 거는 마치 우리가 이렇게 비교해볼 수 어떤 공간에 강의실을 나눠 쓸 때 이 강의실을 이 공간을 쪼개서 같은 공간에서 여러 명이 동시에 강의실에 쓰는 거와 비슷하게 우리가 이해를 할 수가 있겠죠.
하지만 이것도 굉장히 정교한 기술들이 필요한데요.
실제로 이 주파수 대역을 굉장히 잘게 쪼개서 쓰기 위해서 굉장히 미세한 주파수 차이를 감지해가지고 신호를 복원하는 기술들이 필요합니다.
그래서 주파수가 거의 비슷한 애들끼리는 거의 미세한 차이가 있을 건데 그 미세한 차이를 정확하게 감지해서 특정 주파수 대역 데이터만 딱 뽑아낼 수 있어야 되거든요.
그렇지 않으면은 비슷한 대역의 주파수 데이터들은 전부 다 간섭으로 작용할 거예요.
그래서 이런 부분들을 어떻게 하면은 주파수들이 서로 겹치더라도 거의 영향을 안 미치게끔 할 거냐에 대한 다양한 연구들이 진행이 되고 있습니다.
Random access protocols
이 랜덤 액세스 프로토콜은 앞에서 배운 이제 채널 파티셔닝 기법보다는 훨씬 더 단순하고 가벼운 기술이에요.
그래서 앞에서 이렇게 채널을 쪼개려면 규칙이 필요하죠 주파수 대역으로 쪼갠다든지 시간 대역으로 쪼갠다든지
하지만 이러한 규칙이 사전에 없고 그냥 노드는 만약에 보낼 데이터가 있으면은 자신이 보내는 그 채널에다가 full channel data rate로 그냥 보내게 됩니다.
그렇기 때문에 노드 사이에서 어떤 사전 조율도 없고 내가 보낼 데이터가 있으면은 그냥 데이터를 보내는 거예요.
그러면은 당연히 동시에 두 개 이상의 노드가 데이터 전송하면 당연히 충돌이 나겠죠.
이렇게 충돌이 났을 때 random access MAC protocol은 어떤 절차가 필요하냐면요.
충돌이 났으면 어떻게 이 충돌을 일단 감지를 해야 돼요. 충돌을 어떻게 하면 감지할 수 있을까 그리고 충돌이 났으면은 빨리 recover를 해서 피해를 좀 최소화하고 다음부터는 좀 충돌을 좀 줄이는 방향으로 동작시키는 게 이득이겠죠.
데이터에 보내지 충돌이 났어 그러면은 다음에는 좀 가능하면 충돌이 안 나는 방향으로 내가 데이터 전송을 좀 제어하자는 거죠.
그렇게 함으로 인해서 이거는 충돌을 아예 피하고자 하는 방법은 아니고 충돌을 어느 정도 허용하지만 이 충돌의 빈도를 좀 줄이는 방향으로 굉장히 가볍게 만든 프로토콜이다.
CSMA (carrier sense multiple access)
랜덤 엑세스 맥 프로토콜은 다양한 종류의 프로토콜이 있는데요.
먼저 csma 방식에 대해서 이야기를 해볼게요. 어떤 캐리어를 감지를 하면서 멀티플 액세스를 지원하자 이런 말이에요.
그럼 이 carrier sense하는 이유는 뭐냐
바로 일단은 내가 보내기 전에 한번 들어라는 인트리션을 가지고서 만든 프로토콜이에요.
즉 내가 데이터를 보낼 때 먼저 다른 사람도 동시에 보내는 애가 있는지 한번 보고서 데이터를 보내라
+우리가 여러 사람이 대화할 때 이러한 비슷한 동작을 취하거든요.
여러분들 친구들이랑 대화할 때 친구들이랑 말을 동시에 해버리면 안 되죠 동시에 말을 해가지고 좀 이렇게 뻘줌한 상황 많이 생기잖아요.
그래서 우리가 가능하면 대화할 때 어떻게 하죠.
친구가 할 말이 있나 좀 잠깐 머뭇거리다가 친구가 말을 안 하는 것 같으면 그때서야 이제 말을 하잖아요.
그렇게 해서 최대한 충돌을 줄이는 거죠.
이 csma도 마찬가지로 보낼 데이터가 있는데 데이터가 있다고 바로 보내는 게 아니에요.
데이터가 있으면 일단은 채널을 한번 봅니다.
누군가 데이터 지금 보내고 있는 거 아니야 근데 채널을 봤더니 아무런 신호가 없어 그러면은 지금 아무도 데이터 안 보내네 그때 보내자는 겁니다.
그래서 만약에 지금 채널을 사용하는 사람이 없다라는 것이 감지가 되면은 그때 전체 내가 보내고자 하는 프레임을 쫙 보내라 근데 채널이 현재 b지 바쁜 상태라고 감지가 됐어요.
누군가 다른 사람이 데이터 보내는 신호가 감지가 된 거예요.
그러면은 전송을 일단 미뤄라라는 겁니다.
그래서 앞에서 말한 것처럼 리슨 디포 토크 이야기하기 전에 한번 들어라 그렇게 해야지 다른 사람이 말하는 걸 방해하지 않는다라는 거죠.
그러면은 여러분 이 방식을 쓰면은 100% collision을 막을 수 있을까요.
여러분들 친구들이랑 대화할 때 이런 경우 있죠 지금 친구가 말을 안 하는 것 같아서 말을 하는 찰나에 갑자기 동시에 말하는 경우가 종종 발생하잖아요. 이 csma 프로토콜도 완벽하게 collision을 차단할 수 없습니다.
다음 그림을 보세요. CSMA의 collision이 발생하는 경우를 보여주고 있는데요.
b랑 d가 거의 동시에 데이터를 발생시키는 상황입니다.
먼저 b가 데이터를 발생시켰어요.
그러면은 얘네들은 같은 서브 넷에 있고 링크를 공유하기 때문에 b가 데이터를 발생시키면은 그 데이터 전파 신호가 점점 퍼져나갈 거예요.
하지만 퍼져나가는 동안은 시간이 있겠죠.
그래서 b의 신호가 t 제로에서 발생해서 이렇게 신호가 퍼져나간다고 해봅시다
근데 b 입장에서는 아직 d가 보낸 신호를 아직 감지를 못했어요.
물론 아주 빠른 시간에 도달하겠지만 아주 미세한 시간 차이로 아직 d의 신호를 감지를 못한 겁니다.
그래서 d 입장에서는 지금 t1 입장에서는 지금 채널이 idle하네라고 인식할 수 있다는 거죠.
왜냐하면 b의 신호가 아직 도달하지 않았기 때문에 그래서 d도 다음같이 신호를 발생시킵니다.
나도 데이터 보내야지 하는 거죠. 그러다 보니까 다음과 같이 이 부분 collision이 발생이 하더라
아주 미세한 차이로 인해서 그래서 이 전파가 전달되는 프로파게이션 딜레이 있기 때문에 이 프로파게이션 딜레이에 의해서 b가 보낸 신호가 뒤에 도달하지 않는 미세한 타임 갭이 생기게 되고 이때 d가 만약에 데이터를 전송하게 되면 collision이 발생한다라는 거예요.
CSMA/CD (collision detection)
그래서 이 부분을 조금 개선하기 위해서 나온 프로토콜이 CSMA/CD입니다.
뒤에 붙은 cd는 collision 디텍션이에요.
이 collision 디펙션이 뭐냐면은 아까 csma가 일단은 컬리션 확률을 꽤 낮춰주는 건 맞아요.
그러니까 바로 던지는 것보다는 그래도 한 번 신호 감지한 다음에 던지는 게 컬리션의 확률을 확 낮춰줍니다.
그럼에도 불구하고 퀄리션을 100% 막을 수는 없다 그랬죠 그러면은 컬리션이 만약에 발생하면 어떻게 해야 될까에 대한 절차를 추가한 게 바로 csma/cd입니다.
뭐냐면은 만약에 내가 데이터를 보냈는데 collision이 발생한 걸 알았어요.
그러면은 지금 여기서는 csma는 collision이 발생해도 그냥 데이터 쭉 발생하거든요.
그럼 사실상 이 데이터는 충돌이 났기 때문에 사실상 복원하기 힘든 버리는 데이터가 되는 겁니다.
즉 내가 지금 다 보내면은 채널만 낭비하고 실제로는 데이터 전송이 일어나지 않는 거예요.
그러니까 내가 충돌이 났으면은 데이터를 빨리 전송하라 멈추는 게 이득이지 이렇게 데이터를 쓸데없이 발생시키는 거는 낭비가 되겠죠.
그래서 이 csma/cd는 어떻게 하냐면은요 만약에 커미션이 감지가 되면은 지금 보내고 있는 전송을 바로 abort, 중단시킵니다.
왜냐면은 어차피 지금 보내면 충돌 때문에 다 제대로 전송이 안 될 거니까 빨리 중단시켜서 채널의 낭비를 막자는 거죠.
그러면 이 csma/cd를 지원하기 위해서는 컬리션의 감지를 하는 게 굉장히 중요합니다.
컨디션을 그럼 어떻게 감지하느냐 바로 신호의 세기를 측정하자는 거예요.
그래서 내가 전송한 신호 세기가 있을 거고요 내가 받은 신호 세기가 있을 겁니다.
근데 내가 전송한 신호 세기보다 다른 신호들이 막 합쳐지게 되면은 신호가 더 증폭이 될 수 있겠죠.
그렇기 때문에 지금 뭔가 충돌이 나가지고 내가 보낸 신호보다 더 많은 신호들이 지금 잡힌다라고 하면은 충돌이 났다라고 우리가 감지를 하자는 겁니다.
이 wired len에서는 굉장히 쉽게 collision detection이 구현이 될 수가 있습니다.
하지만 이 무선 상황에서는 사실 collision detection이 잘 되진 않거든요.
그 이유는 무선에서는 여러 가지 노이즈들이 막 섞이기 때문에 실제로 이렇게 신호 세기만 가지고서 쿼리전 여부를 판단하기는 굉장히 어려운 부분이 또 있습니다.
그래서 이 csma cd 방식이 이 유선에서 굉장히 많이 사용이 되는 멀티플 액세스 기술입니다.
그래서 csma/cd가 동작하는 것을 한번 다음 그림을 통해서 볼게요. 그래서 신호를 발생시키죠 그런데 얘는 입장에서 지금 어떤 아무도 채널을 안 쓰네라고 생각하고 보냈지만 결국에는 충돌이 발생하죠.
충돌이 충돌을 감지하자마자 어볼트 시켜서 더 이상 데이터 안 보내고 여기서 끝나게 됩니다.
그래서 이더넷에서는 이 csma cd를 어떻게 동작시키는지 세부 절차를 한번 볼게요.
랜덤 액세스 기술 중에 하나인 csma/cd라는 프로토콜은 다음과 같은 절차로 이더넷의 프로토콜을 구현하고 있습니다.
1) 먼저 네트워크 인터페이스 카드 nic가 네트워크 레이어로부터 이제 데이터그램을 받죠. 그다음에 이제 링크 레이어 프레임을 만듭니다.
2) 그리고서 이 네트워크 인터페이스 카드 nic는 현재 채널이 비었는지를 감지해요. 만약에 비었다라는 게 감지가 되면은 프레임을 전송하고요 만약에 지금 다른 사람이 채널을 쓰고 있다라고 하면은 채널이 좀 idle 해질 때까지 기다립니다.
3) 만약에 채널이 지금 idle해서 보냈다라고 해봅시다. 근데 보내는 동안 즉 전송 동안에 어떠한 collision이 감지가 안 됐어요. 그러면은 collision 없이 쭉 모든 프레임을 성공적으로 보내는 게 되겠고요 만약에 전송 중에 신호 세기에 변화가 생겼어요. 즉 뭐냐면 데이터를 보내는 중에 collision이 감지가 된 겁니다. 그러면 더 이상 보내지 말고 빠르게 어볼트로 들어가서 데이터 전송을 중지시킵니다.
근데 여기까지가 이제 우리가 배운 내용인데 추가적으로 5번 절차가 csma/cd에 추가가 돼 있어요.
5) 이더넷에 뭐냐면은 어볼트 한 다음에 어떻게 할 거냐
어볼트 한 다음에 nic은 바이너리 백오프 절차에 들어갑니다.
이 바이너리 백오프 절차는 뭐냐면은요
내가 abort 했으면은 언젠가는 이 데이터를 다시 보내야 될 거잖아요.
그러면은 얼마큼 기다렸다가 데이터를 보낼 거냐 이 기다리는 시간을 바이너리 방식으로 계산하게 하는 방법입니다.
뭐냐면은 내가 abort 한 다음에 조금 이따 바로 보내면은 사실 앞에서 데이터 보내는 애들이 계속 연속해서 보내니까 또 충돌하고 또 충돌하고 이렇게 충돌이 반복되는 확률이 있잖아요.
그러니까 내가 지금 충돌이 났으면은 사실 조금 기다렸다가 들어가야지 충돌할 확률을 좀 줄일 수가 있습니다. 그래서 얼마큼 기다렸다가 내가 다시 데이터 전송을 시도할 거냐를 정의할 필요가 있는데 그게 이 5번 바이너리 백오프 절차에 의해서 내가 얼마큼 쉬었다.
데이터를 다시 보낼지를 결정하게 됩니다.
CSMA/CD Binary Exponential backoff
그래서 이 바이너리 익스프레션 백오프는 어떻게 동작하냐면요.
만약에 어볼트가 일어나고 만약에 nic가 동시에 또 보낼 수도 있잖아요.
너무 조금 있다가 다시 시도하면은 서로 보낼 데이터가 계속 있는 거예요.
그럼 또 콜리션을 할 겁니다. 그래서 이걸 조금 확률적으로 우리가 완화할 수 있는 방법은 각각의 노드들이 한 번 collision이 체크가 됐으면은 좀 랜덤하게 쉬었다가 전송하자 그러면은 어떻게 보면 이 충돌할 확률이 현저히 낮아지지 않을 거냐라는 거예요.
그러면은 이 랜덤하게 쉴 건데 그러면 얼마큼 랜덤하게 쉴 거냐 만약에 오랫동안 랜덤하게 쉰다라고 하면은 문제가 뭐냐면은 너무 전송하는 전송 텀이 길어지면서 성능이 낮아지겠죠. 내가 보낼 데이터를 안 보내고 계속 오랫동안 기다리는 거니까 성능이 나빠질 거예요.
그러면 좀 그럼 짧게 쉬었다가 보낼까라고 하면은 상대적으로 퀄리전이 다시 발생할 확률이 높을 수가 있습니다.
즉 너무 커도 안 되고 너무 적어도 안 되니까 이 중간에서 적절한 랜덤 값을 선택해서 쉬는 게 중요합니다.
그래서 이것을 우리가 이 Binary Exponential backoff 방식으로 결정하게 되는데요.
바이너리 백오프 방식은 충돌한 횟수 만약에 m 번 연속 충돌이 났다.
그러면은 2^m (0에서 (2^(m))-1)사이의 랜덤 값을 취해가지고 그거의 배수로 기다리는 시간을 정하자라는 겁니다.
그래서 네트워크 인터페이스 카드는 랜덤값 k를 결정하는데요.
이 랜덤값 k의 범위가 어떻게 결정되냐면은 0에서 2의 m 승 마이너스 1 사이에서 랜덤으로 추출이 됩니다.
즉 충돌이 많이 일어나면 많이 일어날수록 확률적으로 2의 m 승 마이너스 1이 커지기 때문에 더 큰 값이 랜덤으로 선택될 기회가 늘어나는 거고요 만약에 충돌이 난 지 얼마 안 됐으면은 사실상 지금 데이터가 계속 충분히 될 확률이 상대적으로 적다고 생각해서 이 m 값이 작은 거잖아요. 그래서 랜덤 값이 추출의 범위가 작아지면서 상대적으로 작은 케이스가 선택이 됩니다.
그러면은 이 k 값이 이제 랜덤으로 결정되면은 케이x512(비트타임)
비트타임은 지금 현재 링크에서 한 비트를 전송할 때 시간입니다.
그래서 한 비트를 전송할 때 시간은 (512xk(비트타임))로 이제 최종적으로 내가 기다릴 시간 backoff 타임이 결정이 됩니다.
그래서 이 시간만큼 기다린 다음에 다시 이제 데이터 전송을 시도하는 거죠.
그래서 바이너리 백오프 n 번째 collision이 발생하면은 nic는 k를 선택한다 랜덤으로 근데 이 범위 안에서 그리고 nic은 k 곱하기 512 곱하기 비트타임 만큼 기다린다 그래서 여기 예시는 실제 숫자를 한번 대입해본 건데요.
+만약에 컨디션이 한 번 났다 그러면 m이 1이니까 < 0 or (2^1승)-1 = 1이죠. >
즉 k는 0 아니면 1이 되는 거예요.
만약에 k가 0이 되면은 기다리지 않고 바로 보내는 게 되고요 케이가 1이면은 1 곱하기 512 곱하기 비트타임
지금 이더넷이 100메가 bps했으면은 한 비트 보낼 때 시간이 대략적으로 5.12 마이크로 세컨드라고 합니다.
그러면 이 5.12 마이크로 세컨드를 여기 비트 타입으로 대입해서 기다리는 시간에 계산하면 되겠죠.
이 512 비트 타임이 바로 5.12 마이크로 세컨드가 되겠죠.
5.12 마이크로 세컨드가 512 곱하기 비트 타임이 계산된 결과입니다.
그리고 만약에 두 번 컬리션이 연속으로 발생했다.
그러면은 0 1 2 3 중에서 k가 랜덤으로 선택이 되고 똑같은 공식에 의해서 이 백오프 타임이 결정이 됩니다.
collision이 늘어남에 따라서 exponential하게 그래서 우리가 이제 맥 프로토콜에서 멀티플 액세스 방법을 우리가 배웠는데요.
채널 파티션 기법이 있고 랜덤 액세스 기법이 있다라고 우리가 정리를 할 수 있겠습니다.
그다음에는 이제 링크 레이어에서 제공하는 기능인 error detection 그리고 correction에 대해서 알아보도록 할게요.
우리가 링크 레이어에서 제공하는 기능 중에 하나가 인접한 노드 사이에서 이제 reliable한 전송을 이제 좀 도와주는 역할을 하고 있습니다.
그래서 각각의 프레임이 이제 링크를 따라서 에러 없이 전송하도록 이제 도와주는 거죠.
그래서 보통 이더넷 같은 데서는 비트 에러가 상대적으로 덜 발생해요.
하지만 무선 링크에서는 굉장히 이 에러에 취약하기 때문에 만약에 링크 레이어에서 이런 에러를 감지하고 복구해 주는 기능을 제공하지 않으면은 사실상 tcp 단에서 이 에러를 복구해야 되기 때문에 굉장히 많은 지연이 발생하게 됩니다.
end to end로 복구를 해줘야 되기 때문에 그래서 기왕이면은 이 에러를 locally 즉 이 링크 레이어에서 복원을 하면은 이 엔드 투 엔드 transmission이 최소화되기 때문에 훨씬 더 네트워크 성능을 개선시킬 수 있는 좋은 점이 있습니다.
그래서 링크 레이어에서 제공하는 서비스로 첫 번째는 에러 디텍션이 있고요 두 번째는 에러 커렉션이 있습니다.
그래서 에러 디텍션을 하기 위해서는 에러는 일반적으로 어떤 신호가 점점점점 멀리 전파되면 신호가 약해지거든요.
신호 감세에 의해서 사실상 오리지널 신호가 뭔지 잘 확인이 안 돼가지고 에러가 발생할 수도 있고요. 아니면은 주변에 노이즈가 막 껴가지고 원래 신호가 원 신호가 이건데 주변에 막 노이즈가 막 더해져가지고 이 원래 신호가 왜곡이 되는 거예요.
그래서 이 원래 신호가 뭔지를 수식단에서 복원을 못하는 거죠. 이래서 이제 에러가 생길 수가 있습니다.
그래서 이 리시버는 이 에러의 존재를 에러가 있는지 없는지를 일단 알아내야 되겠죠.
그래서 에러가 만약에 있다라고 하면은 재전송을 요구할 수도 있고 아니면 단순히 그 에러 난 프레임을 드랍시킬 수도 있습니다.
이게 아주 그냥 기본적인 방안이고요 여기에 이제 플러스로 에러를 커렉션의 기능까지 우리가 넣게 되면은 이 감지된 에러를 우리가 복구할 수 있으면은 이 감지된 에러를 좀 최대한 복구해서 재전송을 줄이는 방향으로 우리가 유도할 수가 있습니다.
그러면 어떻게 이 에러 디텍션과 커렉션이 이 링크레이어에서 지원이 되는지 그 원리에 대해서 우리가 배워보도록 하겠습니다.
먼저 에러를 디텍션하고 컬렉션을 동시에 이제 진행하기 위해서는 우리가 edc라는 정보를 활용합니다.
EDC= Error Detection and Correction bits (redundancy)
D = Data protected by error checking, may include header fields
그래서 다음과 같이 데이터가 이렇게 있으면은 이 데이터그램에 edc라고 하는 이제 위변검사 비트를 붙입니다.
그래서 이 비트를 통해서 다음과 같이 에러가 없이 전송된 데이터인데 이게 이제 가다가 에러가 생긴 거예요.
그러면 이 edc 정보를 참고를 해가지고 에러가 있다라고 하면은 누락시킨다거나 이제 복원 correction을 시키고요 아니면은 에러가 없다라고 하면은 상위 레이어로 올려주는 거죠.
그래서 이 EDC비트는 일반적으로 우리가 parity비트 방식 형식으로 구현을 할 수가 있는데요.
다음 같이 이게 오리지널 비트라고 해봅시다 그리고 여기서 우리가 전체의 1의 개수를 짝수로 만들도록 이 parity 비트에 하나에 추가하는 거예요.
그러면은 이 parity 비트까지 합치면은 이 전체 비트가 짝수가 돼야 되는데 여기서 만약에 한 비트가 0으로 flip이 돼가지고 에러가 생겼어요. 그러면 우리가 이걸 봤을 때 전체 비트가 홀수가 되면은 지금 에러가 있구나라고 우리가 알 수가 있는 거예요.
그래서 만약에 리시버에서 전체 1의 개수와 이 parity 비트까지 포함해서 전체 1의 개수가 지금 홀수 개다 그러면은 에러가 있다라는 걸 즉시 알 수가 있습니다.
그래서 이렇게 아주 간단한 parity 비트를 하나 추가함으로 인해서도 우리가 에러를 손쉽게 디텍션을 할 수는 있는데 근데 이러한 심플한 방식은 에러를 100% 잡아내지 못합니다.
만약에 두 개가 0으로 뒤집히면은 1의 개수는 여전히 짝수죠 그렇기 때문에 이때는 에러 감지가 안 되고요.
그리고 만약에 우리가 에러를 커렉션하고 싶다라고 했을 때 이 어떤 비트가 일어났는지는 모르잖아요.
그러니까 사실상 이렇게 단순한 parity 비트를 활용하면은 커렉션은 할 수가 없습니다.
two-dimensional bit parity
그래서 조금 더 에러를 잘 잡아내고 correction 확률도 높이기 위해서 생각한 게 이제 two-dimensional bit parity 방식입니다.
뭐냐면은 지금 배운 이 parity bit를 이렇게 가로 축으로 페리티비티를 붙이고요 이렇게 컬럼 쪽으로도 parity bit를 붙이는 겁니다.
이 부분이 오리지널 데이터인데 여기서 이게 에러가 났다고 해봅시다.
에러가 나면은 지금 이쪽으로 봤을 때 지금 1의 개수가 홀수 개죠 그러니까 일단은 이 row에서 에러가 났다는 게 감지가 돼요.
그리고 이 칼럼 측에서도 봤을 때 지금 홀수죠 홀수니까 이 칼럼에서 에러가 났다는 거 알 수가 있게 돼요.
그럼 이 colum가 이 row의 교집합이 되는 비트는 바로 이거 하나죠 그래서 이 비트가 에러 비트구나라는 거 알고 얘를 0에서 1로 바꿔줍니다.
그래서 다음과 같이 two-dimensional bit parity를 활용하게 되면은 우리가 에러를 디텍트하고 커렉션까지 할 수가 있게 됩니다.
그래서 이것을 통해서 재전송을 줄일 수가 있고요. 그리고 우리 서버 단에서 굉장히 빠르게 이 에러 커렉션을 할 수가 있게 됩니다.
그래서 이렇게 redundant한 패리티 방식을 도입을 해서 어떻게 보면 redundancy를 더 많이 붙이니까 오버헤드가 좀 많은 방식이에요.
Forward Error Correction (FEC)
오버헤드를 도입하더라도 리시버 단에서 에러를 감지하고 커렉션까지 빠르게 해줄 수 있도록 이렇게 지원하는 기술을 우리가 Forward Error Correction (FEC)이라고 합니다. 즉 전방에서 빠르게 에러를 감지해서 고치는 기술이다라고 해서 포드 에러 커렉션이라는 이름을 붙이고 있는데요. 이러한 방식은 상대적으로 이런 parity bit에 대한 오버헤드가 증가함에도 불구하고 결과적으로 성능 분석을 해보니까 tcp 단에서 재전송하는 것보다 이득이 많다라고 해서 무선 단에서 굉장히 많이 사용이 돼요.
+왜 무선 단에서 많이 사용이 되느냐 앞에서 이야기한 것처럼 무선 땅에서는 loss가 일어날 확률이 유선보다 훨씬 높죠 만약에 유선에서 이러한 방식을 채택을 하면은 사실상 에러는 거의 안 발생하는데 매번 이렇게 패리티비티에 대한 오버헤드를 지불해야 되니까 득보다는 실이 클 겁니다.
하지만 에러가 굉장히 빈번하게 발생하는 무선 단에서는 좀 redundancy를 감안하더라도 이렇게 parity bit를 활용해서 에러를 커렉션해주는 게 end to end 재전송을 줄이는 개인이 훨씬 더 크기 때문에 실보다는 득이 더 많기 때문에 무선에서 굉장히 많이 도입이 되고 있습니다.
그리고 실시간 애플리케이션에서도 또 많이 사용이 된다고 합니다. 왜 그럴까요. 실시간 애플리케이션도 역시나 재전송이 많아지면 그만큼 끊길 확률이 늘어나겠죠. end to end 딜레이가 늘어나니까 그래서 빠르게 이 포워드 에어 커렉션 방식으로 에러를 잡아내는 게 훨씬 더 재전송보다는 이득이 많다라고 합니다.
그다음에 마지막으로 이 len에서 스위치에 대해서 우리 배워보도록 할게요.
Ethernet switch
이더넷 스위치는 이제 link-layer device 라고 해서 우리가 store and forward 방식으로 동작하는 장비가 되겠습니다.
그래서 들어오는 프레임의 맥주소를 평가해가지고 이제 outgoiong link 즉 이 맥주소가 일치하는 링크로 보내주는 작업을 하게 됩니다.
그리고 csma/cd 기능도 사용을 해서 엑세스도 제어를 하게 됩니다.
그래서 이제 호스트 입장에서는 내 중간에 이 스위치가 있다라는 존재를 알 수 없고요. 그리고 이 스위치 포트에는 어떠한 맥 어드레스도 할당돼 있지 않습니다.
+즉 이 transparent하다는 거는 우리나라 말로 하면은 투명하다라는 뜻이거든요.
투명 마치 우리 물이 투명하면은 물이 투명하면은 마치 물이 없는 것처럼 느껴지잖아요.
이 불투명하면은 지금 굉장히 지저분한 물이 있네라고 보지만 물이명하면은 바닥까지 훤히 보이죠.
그래서 아무것도 없는 것처럼 우리가 느끼잖아요.
마찬가지로 이 스위치가 transparent하다라는 말은 이 노드 입장에서는 중간에 스위치 장비가 있는지 없는지를 인지하지 못한다라는 겁니다.
그리고 plug and play, self learning 방식으로 동작을 합니다.
그러니까 자동으로 특별히 사용자가 어떤 매뉴얼리 컴플리케이션 하는 게 필요 없이 그냥 설치만 하면은 애가 자동으로 동작이 된다라는 거죠.
그래서 여기 그림에서와 같이 이 스위치에 연결된 호스트들은 이 스위치의 다이렉트 커넥션에 갖게 되고요 지금 다이렉트로 이렇게 이 스위치 포트에 연결이 되죠. 그리고 이 스위치는 이 각각의 호스트가 보낸 데이터를 임시로 버퍼를 합니다.
버퍼를 한 다음에 맥 주소를 보고서 어떤 링크로 보낼지를 이제 알고 그 맥주소를 갖고 있는 디바이스 링크로 포워딩을 합니다.
그리고 이 스위치에서는 다음과 같이 a와 a' 그리고 b와 b'가 동시에 데이터를 보낼 수 있도록 합니다.
그래서 이거를 조금 어려운 말로 collision domain 을 나눠준다라고 합니다.
그래서 일반적으로 이 스위치가 없이 버스 형태로 우리가 데이터를 보내게 되면은 이 모든 노드들이 동일한 컨디션 도메인에 위치에 놓이게 되는데요.
근데 이 스위치가 데이터를 잠시 버퍼링을 해주기 때문에 사실상 collision domain을 스프리팅 할 수 있는 이점도 우리가 갖게 됩니다.
그러면은 우리가 이 이 스위치 입장에서는 이 a'라는 애는 4번 링크에 붙어 있고 그리고 b'라는 애는 오번 링크에 붙어 있습니다.
즉 b'의 맥주소와 이 포트 번호 매핑은 이 스위치는 알고 있어야 되잖아요. 그러면 이런 것들을 우리가 따로 콤피그레이션을 하지도 않았는데 어떻게 스위치가 알게 될까요.
정답은 바로 이 스위치가 스위치 테이블이라는 것을 생성을 한다는 겁니다.
그래서 이 호스트의 맥 어드레스와 이 맥 어드레스가 연결된 인터페이스 정보 그리고 이 정보들을 킵해놓을 시간, 시간을 갖고 있는 스위치 테이블을 이 스위치가 스스로 만들어서 관리를 하게 됩니다. 마치 라우팅 테이블과 같은 거죠.
그러면은 이 테이블이 우리가 어떻게 이제 우리가 생성이 되는지 한번 볼게요.
이 스위치는 이제 어떤 호스트가 어떤 인터페이스를 통해서 접근이 가능한지를 배우고 그걸 테이블 형태로 우리가 만들어야 되는데요.
예를 들어서 다음 같은 테이블 형식이 있다고 합시다.
ttl은 이제 얼마큼 이 정보들을 유지할지에 대한 시간 정보죠.
그러면은 a가 이 source 주소는 자기 자신 그리고 destination 주소를 이 a'로 통해서 보냅니다.
그러면 스위치로 오죠. 그러면 여기서 스위치는 일단은 a라는 맥주소를 갖고 있는 source 맥주소를 여기서 봅니다.
그럼 a라는 source mac 주소를 갖고 있는 애가 1번 포트로 데이터를 보내는구나라는 걸 배우게 돼요.
그래서 이러한 정보를 테이블에 기록해놨습니다.
a라는 맥 주소를 갖고 있는 애는 1번 인터페이스에 연결이 돼 있구나라는 거를 배우면서 스위치 테이블을 업데이트를 합니다.
근데 문제는 a'라는 맥주소는 어떤 인터페이스에 연결되어 있는지 이 스위치는 아직 몰라요 아직 모르면은 어떻게 해야 될까요.
아직 모르면은 flood 절차를 거치게 됩니다.
그래서 다음과 같이 만약에 incomming 링크와 sending 호스트의 맥주소를 가지고서 record를 합니다.
그럼 이건 추후에 우리가 계속 쓸 수가 있는 거예요.
이 스위치 테이블을 보고 만약에 목적지의 엔트리가 이제 발견이 되고 이 데스트네이션이 지금 도착하는 프레임의 데스테이션이다. 그러면 이제 드랍을 시키고요.
만약에 만약에 이 데스티네이션이 현재 엔트리 안에 있는 거다. 그러면은 포워드를 시킵니다.
근데 만약에 엔트리 없다. 그러면은 모든 노드한테 플루드를 시킵니다.
지금 a'는 지금 4번에 연결돼 있다는 거 스위치 잘 모르죠.
왜냐하면 지금 스위치 테이블에 없으니까요.
그러면은 다음과 같이 기록하고 지금 a라는 애는 1번에 연결됐다고 기록하고 이렇게 모든 애한테 플로드를 시키게 됩니다.
그럼 플로드를 시키면 주인이 결국엔 찾겠죠.
이거 내 건데라는 것을 a'가 알게 돼요.
그럼 a'는 결국에는 a한테 보낼 어떤 패킷을 만들어내겠죠.
그래서 이 a라는 애가 이제 이거 나한테 온 패킷이네 나도 a한테 보낼 데이터가 있는데 하고서 source를 a'라 하고 destination a로 해서 이제 a한테 보낼 데이터를 만들어서 전송을 합니다.
그럼 이렇게 그러면 이 상태에서 스위치는 드디어 알게 되는 거예요.
지금 a'가 source로 해가지고 이쪽으로 데이터를 보냈죠.
그러면 스위치는 source가 a' 애는 4번에 연결돼 있었구나라는 것을 알게 되고 그걸 스위치 테이블에 업데이트를 합니다.
그럼 이제 드디어 스위치 테이블에 a랑 a'가 어떤 인터페이스에 붙었는지가 다 기록이 됐죠.
그럼 그 이후에는 로딩 절차 생략하고 바로 selectively send 를 할 수가 있습니다.
이제 선택적으로 딱 a로 가는 애는 1번로 보내고 a' 가는 거에는 4번으로 보내고 이렇게 바로 인터페이스 매핑해서 보내는 작업을 스위치가 담당할 수 있다는 거죠.
그리고 실제로 스위치는 이렇게 여러 개 계층적으로 연결이 될 수도 있거든요.
이때도 똑같은 원리로 우리가 데이터를 이 멀리 있는 애로 보낼 수가 있어요.
a가 만약에 g로 보낸다라고 해봅시다.
그럼 a가 g로 보내려면은 똑같이 이 스위치 입장에서 만약에 a가 g로 보낼 때 모르죠.
모르면은 여기서 전부 다 플로딩을 시키는 겁니다.
플로딩을 시키면은 애가 또 이 데이터를 보고서 또 전달시키고 전달시켜가지고 결국에는 g라는 애가 여기에 연결돼 있다라는 것을 알고
또 얘는 g라는 애가 여기 연결돼 있다는 것을 알게 되고 마지막으로 s3는 g라는 애가 여기 연결돼 있다는 것을 알게 될 겁니다.
그렇게 포워딩 테이블이 생성이 되면은 그다음부터는 이렇게 셀렉티브하게 보낼 수가 있게 되는 거죠.
네 그래서 이 스위치가 아무리 많아져도 동일한 방식으로 스위칭 테이블을 계속 업데이트하면서 이 셀렉티블리 전송을 할 수 있게 됩니다.
이걸 우리가 이 스위치의 셀프 러닝이라고 합니다. (self learning)
스스로 스위치 테이블을 만들어 나가잖아요.학습을 통해서 즉 이 솔 어떤 데이터가 발생할 때 그 데이터가 발생한 소스와 연결된 인터페이스를 테이블로 계속해서 학습해 나가면서 점점점점 플로딩은 줄이고 셀렉티브하게 보내는 횟수를 늘려나가는 것 이것을 우리가 셀프 러닝이라고 합니다.
그래서 실제 우리가 네트워크를 구성할 때는 다음과 같이 스위치들로 이 서브넷을 구성하고요 그리고 여기 게이트웨이 라우터가 있고요 이 게이트웨이 라우터 그리고 웹 서버나 메일 서버 등을 이렇게 붙이기도 합니다.
이건 어떤 조직 내의 네트워크에 하나의 예시를 보여주고 있는 겁니다.
스위치 VS 라우터
스위치와 라우터를 우리가 비교해보면은요.
라우터는 이제 네트워크 레이어 디바이스라고 하고요 그렇기 때문에 l3 장비라고 합니다.
스위치는 링크 레이어 디바이스라고 해서 l2 장비라고도 이야기를 합니다.
그리고 이 라우터와 스위치는 이 포워딩 테이블을 가지고 있죠 다만 이 라우터는 포워딩 테이블이 바로 ip 주소 기반으로 동작을 하고요 그리고 라우팅 알고리즘이 이 포워딩 테이블을 만들어냅니다.
그리고 스위치는 맥 어드레스를 기반으로 한 포워딩 테이블을 생성을 하고요 그리고 플로딩과 셀프 러닝 절차에 의해서 이 이 포워딩 테이블을 생성이 됩니다.
그래서 마지막으로 우리가 지금까지 배운 애플리케이션 레이어부터 링크 레이어까지 쭉 내려왔잖아요.
그래서 실제 우리가 웹 서버로부터 데이터를 받을 때 어떤 전체 풀 전체 풀 그림이 어떻게 되는지를 한 번에 정리하는 내용을 여기 6.7에서 우리 다루고서 이번 챕터를 마무리 짓도록 하겠습니다.
그래서 우리가 한 학기 동안에 이제 애플리케이션 레이어 트랜스포트 레이어 네트워크 레이어 링크 레이어까지 내려왔습니다.
그래서 이 각각의 레이어들이 유기적으로 맞물려가지고 동작하면서 우리가 발생하는 데이터가 목적지까지 갈 수가 있는 거거든요.
그러면은 지금까지 이렇게 하나하나 챕터해서 배웠던 내용들이 어떻게 유기적으로 돌아가는지를 이 빅픽처를 한 번에 한번 보면서
지금까지 배운 내용을 정리하도록 하겠습니다.
시나리오는 다음과 같아요. 여러분들이 여기 스쿨 네트워크에 접속이 돼 있습니다.
그리고 여기에는 여기는 구글 네트워크에 있는 웹 서버를 보여주고 있고요 이거는 dns 서버입니다.
그러면은 여러분들이 이제 데이터를 처음에 발생을 시키려고 브라우저를 딱 켰어요.
그러면은 처음에는 여러분들이 네트워킹 하려면 뭐가 필요하죠?
당연히 여러분들이 ip 주소를 받아야 되잖아요.
여러분들이 고정 ip를 쓰고 있는 게 아니라면은 그러면은 바로 dhcp 절차에 의해서 여러분들이 ip 주소를 받게 됩니다.
네 일반적으로 프라이빗 ip 주소를 많이 받는다고 했죠.
그리고 자기 자신의 ip 주소만 받고 끝나는 게 아니라 첫 번째 합의 라우터의 ip 주소 그리고 dns 주소도 한꺼번에 패킷으로 받게 됩니다.
그래서 여기 보면은 dhcp 메시지를 우리 reqest 메시지를 보내고요. 그러면 라우터는 dhcp 액을 보내면서 이제 ip 주소와 첫 번째 라우터 즉 게이트웨이 라우터 주소와 dns 서버 주소를 알려주게 됩니다.
그제서야 이제 여러분은 ip 주소를 받게 되고 그리고 dns 서버의 주소도 알게 됩니다.
그다음에 이제 여러분들이 이제 구글 닷컴에 접속을 하고 싶은데 문제는 여러분들은 구글 닷컴의 ip 주소를 모르죠.
그렇기 때문에 구글 닷컴의 ip 주소를 먼저 알아내야 되겠죠.
그래서 필요한 절차가 바로 dns 쿼리 절차입니다.
그래서 dns 쿼리를 이제 보내려고 해요.
근데 dns 쿼리를 보내려고 하다 보니까 바로 여러분들이 첫 번째 라우터 인터페이스의 맥 주소를 모르는 거예요.
그렇기 때문에 바로 arp 절차를 통해서 맥 주소를 얻어오는 작업을 해야 됩니다.
네 그래서 arp 쿼리를 먼저 보내고요 그러면은 이 arp 리플라이 통해서 이 첫 번째 라우트의 맥 주소를 알게 됩니다.
그래서 다음 같이 dns 메시지를 이제 맥주소를 붙여서 보내게 되는 거죠.
네 똑같이 이것이 이제 dns 서버까지 가서 이 dns 서버에서는 이제 구글.닷컴의 ip 주소를 여러분한테 알려주게 됩니다.
물론 이 dns 쿼리가 목적지까지 가기 위해서는 이 라우팅 절차가 필요하겠죠. 이 라우팅을 하기 위해서는 우리가 배웠던 ospf라는 인트라 as 라우팅과 bgp라는 인터널 인터 as 라우팅 프로토콜이 활용이 될 거예요.
그래서 그 라우팅에 의해서 결국에는 원하는 dns 서버까지 도달하게 될 겁니다.
그러면은 이 dn 서버는 결국에는 구글 닷컴의 ip 주소를 여러분들에게 다시 리플라이를 해주게 될 겁니다.
드디어 여러분들이 구글 닷컴의 ip 주소까지 알아냈어요.
그제서야 이제 여러분들은 http 리퀘스트를 보낼 수가 있습니다.
근데 htv 리퀘스트를 보내려면은 일단 tcp 소켓을 열어야 되겠죠.
그래서 tcp 소켓을 열기 위해서 3way 핸드 셰이크 과정을 거치게 됩니다.
그래서 3way 핸드 셰이크를 통해서 이제 tcp 연결을 맺게 되고요
cin 패킷을 보내고 cin 액을 받게 되죠.
그다음에 이제 비로소 이제 http 리퀘스트 메시지를 보내는 겁니다.
그래서 http 리퀘스트 메시지를 tcp 소켓을 통해서 보내게 됩니다.
네 이렇게 그러면은 이제 웹 서버는 http 리플라이 보내게 됐죠.
그래서 http 리플라이에 바로 이 웹 서버 여러분이 요청한 이제 오브젝트들을 실어서 보내게 됩니다.
그제서야 여러분들은 드디어 웹 페이지를 띄울 수가 있는 겁니다.
+물론 지금 말한 과정이 엄청나게 빠르게 진행이 되기 때문에 여러분들은 이런 지연들을 거의 못 느낄 거예요.
하지만 여러분들이 이런 웹 페이지 하나하나 볼 때 바로 이러한 과정들이 밑단에서 굉장히 정교하게 일어나고 있다라는 것을 여러분들이 이번 네트워킹 시간을 통해서 이해를 했으면 좋겠고요 비단 네트워킹뿐만 아니라 여러분들이 사용하는 많은 애플리케이션들이 굉장히 복잡한 절차에 의해서 밑단에서 돌아가고 있고 여러분들은 그걸 설계하고 이제 개발하는 일을 이제 하게 될 거다라는 것을 이번 시스템 수업을 통해서 이해를 하면 좋을 것 같습니다.
그래서 챕터 6에서 우리가 배운 내용 이제 링크 레이어 어드레싱 배웠고요 그리고 멀티플 엑세스 기능 배웠고요 그리고 에러 디텍션과 커렉션 기능 배웠습니다.
그다음에 이더넷과 스위치에 대해서 배웠고요 마지막으로 전체 이제 이 애플리케이션 레이어에서 링크 레이어까지 어떻게 유기적으로 동작하는지를 우리가 웹 리퀘스트 시니어를 통해서 총 정리를 했습니다.
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
컴퓨터 네트워크컴퓨터 네트워크 21일차 : Distance Vector 알고리즘(2) (0) | 2021.11.17 |
---|---|
컴퓨터 네트워크 20일차 : 라우팅 알고리즘, 다익스트라 알고리즘, link state, distance vector (0) | 2021.11.16 |
컴퓨터 네트워크 19일차 : 라우터 기능, 방화벽 (0) | 2021.11.09 |
컴퓨터 네트워크 18일차 : IP addressing, DHCP, NAT (0) | 2021.11.06 |
컴퓨터 네트워크 17일차 : Network layer (0) | 2021.11.03 |