L2에 대한 내용 정리

2021. 10. 28. 21:49게임서버/TCP IP 이론

320x100

안녕하세요 대학생 개발자입니다.

어제 글을 3개 적으면서 제가 다시 읽어봤는데 주저리주저리에 뇌피셜 가득인 글이더라구요... 어느 정도는 걸러서 들으시면 될 것 같습니다. 부족한 점 있다면 댓글로 잘못된 부분 말씀해 주신다면 반영해서 수정하도록 하겠습니다.

 

이번 글은 저번에 다 정리해보려고 했던 L7 to L7을 쪼개서 L2부분에 대한 내용만 좀 정리를 해보려고 합니다.

 

먼저 L2라고 한다면 ethernet을 통해서 전달되는 계층입니다.

즉 L1을 통해서 직접 연결되어있는 기기간의 통신을 정의하는 것입니다.

 

우선 L2는 연결된 모든 기기에게 데이터를 뿌린다 라는 개념이 존재합니다 브로드캐스팅이라고 합니다

그리고 내가 보내려고 하는 하나의 호스트에게만 데이터를 전달하는 유니캐스트가 존재합니다.

그리고 일부를 묶어서 보내는 멀티캐스트가 존재하는데... 사실 멀티캐스트는 잘 써본 적이 없어서 저도 잘 모릅니다.

 

모든 주소 체계가 그렇습니다. 단 하나만 존재해야 된다가 전제로 깔리게 됩니다.

그렇기 때문에 공인 ip는 단하나만 존재하고 그 프로세스를 확정 짓는 포트도 단 하나만 존재합니다(물론 1 포트 1 프로세스는 아닙니다 1 프로세스가 2 포트를 가질 수도 있고 그 이상도 가질 수는 있습니다)

그러므로 맥 어드레스(L2의 주소체계)라는 것은 전 세계에 이 기기는 단 하나만 존재해야 되며 각 회사마다 텀을 두고 번호를 받아서 그 뒤로부터 +1을 해가면서 하는지 뭐 그런 룰이 있는진 모르겠지만 그런 식으로 겹치지 않게 만들어서 뿌리고 있다고 합니다.

 

 

먼저 L2는 하나의 버스를 공유하며 같이 쓰는 하나의 선이 있습니다.

그래서 하나의 채널로 묶여있다면 모든 호스트들은 다른 호스트가 보낸 프레임을 받게 될 겁니다.

하지만 모든 프레임을 다 받아서 처리하려면 당연히 부하가 크겠고 이 과정은 내 L2에서 맥 어드레스를 판단해서 버릴 건 버리고 내 거만받는 식으로 하고 있답니다!

 

음... 그리고 특징이 있다면 프레임이 제대로 도착했는지에 대한 정보가 보낸 사람에게 돌아가지 않습니다...

참 안타깝지만 내가 보냈는데 상대방이 못 받았다면 L2에서는 보장해주지 않습니다.

뭐... 그래서 예시를 들면 목적지의 컴퓨터가 전원이 off 되어도 중간에 프레임이 손실되어도 송신을 한 사람은 이 사실을 전혀 알 수 없습니다... 물론 이걸 TCP라는 상위 프로토콜이 커버를 하고 있고 CSMA/CD라는 녀석 때문에 colision이 생기더라도 조절해주는 등의 해결을 해주고 있기 때문에 문제는 없습니다.

 

음... 그리고 이건 당연한 걸 수도 있는데 L1 엔 컨트롤 기기 같은 게 존재하지 않습니다.

그래서 각 호스트가 L1에 직접 접근을 하게 되는데 각자의 interface를 통해서 내보내는 방식으로 통신하기 때문에 알아서 L1에 access 하는 방식으로 사용을 하고 있습니다. 그러다 보니 동시에 두 개의 호스트에서 데이터를 보내게 되면 하나가 discard 되게 되는데 그때는 CSMA CD가 잘 보고 있다가 잼이 발생하면 임의의 시간을 대기하고 다시 재전송을 하기 때문에 큰 문제가 없습니다.

 

이더넷 상에서의 맥 어드레스는 6바이트입니다 48비트죠!

헤더에 대해서는 전에 있는 글에서 설명을 드렸으니 스킵하도록 하겠습니다..!

 

L2장비로써는 리피터, 허브, 브릿지 등이 있습니다.

리피터는 말 그대로 들어온 신호를 그대로 증폭시켜서 전파하는 역할을 합니다.

더미 허브는 하나의 버스를 만들어 준다고 생각하면 될 것 같습니다. 리피터를 통해 여러 대의 기기를 연결한다고 생각하면 될 것 같습니다.

브리지(스위치 허브)는 좀 특이한 녀석인데요 여기부터는 맥 어드레스를 구분지어서 보낼지 말지를 결정하는 똑똑한 녀석들입니다. (나머지는 그냥 스피커 역할입니다)

 

스위치 허브는 호스트가 데이터를 보낸다면 그 맥 어드레스를 테이블에 저장해놓고 다른 호스트에서 아까 보냈던 호스트에게 데이터를 보내달라는 요청이 들어오면 거기로 보내는 학습을 한답니다. 사실 학습은 아니고 메모리에 올려놓는다는 거죠

그리고 브릿지에 데이터가 왔을 때 그 맥 어드레스가 테이블에 존재하지 않으면 Flooding이라는 걸 해버립니다.

-Flooding 연결된 모든 호스트로 브로드 캐스팅해버리는 거.

 

결과적으로 프레임을 까서 그 맥 어드레스 테이블을 보고 그 어드레스 테이블이 존재하면 보내고 아니면 Flooding(모든 포트로 똑같은 데이터 전송) 해버립니다(맥 어드레스가 존재하지 않으면 더미 허브와 동일한 기능을 하는군요.)

 

그럼 여기서 의문이 들 수 있죠 나의 맥 어드레스는 알고 있지만 내가 전달하고자 하는 호스트에 대한 정보는 분명 ip, port밖에 없는데 그럼 얘 내는 어떻게 맥 어드레스를 알아내서 전송을 하는 걸까요?

 

우리가 메시지를 보내게 되면 L7 -> L4 -> L3를 거쳐서 L2인 이더넷 레벨까지 내려오게 될 겁니다.

먼저 서브넷 마스킹 이후 그 아이피가 나와 동일 대역이라면 그럼 호스트는 ARP 프로토콜을 브로드 캐스팅해서 이 아이피를 가진 호스트가 누구니 하고 물어본 뒤 그 호스트가 대답을 해주고 그 호스트가 대답을 했다면 같은 LAN상에 있다는 의미로 직접 전달하게 되고 그게 아니라면 default인 공유기로 던져버린답니다. 다른 기기를 찾아내는 일을 수행 후 그 맥 어드레스를 알아낸 다음 실제 필요한 데이터를 보낸다고 합니다.

 

명령 프롬프트 창에서 route print -4를 뚜들기면 network와 subnet mask, interface에 대한 정보를 확인하실 수 있습니다.

interface가 어떤 길로 내보내면 그 기기를 찾을 수 있는지에 대한 정보입니다.(이걸... 장치 이름이나 맥 어드레스로 적어줬다면 좀 더 직관적일 텐데 ip를 적어놔서 쪼금 직관적이진 않습니다만 구분하는데 지장은 없을 겁니다... 허허)

 

물론 필요할 때마다 ARP를 쏴서 하는 방식은 아니고(실제 그렇다면 네트워크는 ARP로 마비가 되겠죠) 일정 시간 동안 캐시를 해뒀다가 쓰지 않게 되면 지우는 방법으로 사용하고 있습니다. 그리고 이 시간은 매우 짧습니다 몇 초 내외입니다.

 

 

오늘은 그림 한 장 없이 글만 주르르륵 적어버렸네요...

뭐 이런 날도 있고 저런 날도 있는 거죠.

째뜬 오늘도 긴 글 봐주셔서 정말 감사드립니다. 좋은 정보가 되었으면 좋겠습니다.

부족한 점 있다면 댓글로 남겨주신다면 반영해서 수정하도록 하겠습니다.

 

 

320x100