전편에선 socket과 프로토콜 스택의 동작에 대해 알아봤다. 이 포스팅에선 프로토콜 스택 내부에 있는 IP부분에 대해 자세히 알아보겠음
패킷은 기본적으로 헤더와 데이터로 이루어져 있다.
TCP/IP 패킷도 위와 같은 모양새.
[ [MAC 헤더], [IP 헤더], [ [TCP헤더], [데이터] ] ]
이런 식으로 감쌈.
패킷은 송신처에서 헤더에 주소를 기입하고 데이터부분에 정보를 실어 가장 가까운 중계 장치에 전송함.
중계장치는 도착한 패킷을 자신이 가진 주소 표와 대조. 다음 중계장치로 보냄.
수신처와 송신처의기기를 묶어서 엔드노드(End Node)라 부름
이것이 패킷 전송의 기본. TCP/IP 패킷 전송은 조금 더 복잡함
즉, 우리의 최종 목표인 IP는 변하지 않고, 다음에 갈 중계장치의 MAC 주소만 업데이트 해줌.
허브는 그냥 운반만. 라우터가 MAC주소 업데이트 해줌
또한 이더넷은 대체할 수 있음. IP의 의뢰를 받아패킷을 운반할 수 있는 것들(무선 LAN, ADSL...등).
IP헤더에는 수신처 IP, 송신처 IP, 프로토콜 번호(TCP,UDP등)이 포함됨.
경로표를 따져보고, 해당하는 경로가 없으면 0.0.0.0(기본 게이트웨이)에 해당하는 것으로 간주함.
게이트 웨이 === 라우터*
IP헤더를 붙였으니, MAC 헤더를 붙일 차례임. 이더넷에는 TCP/IP의 구조가 통하지 않음.
송신처 MAC주소와 수신처 MAC주소 그리고 이더 타입이 들어감.
이더 타입(Ether Type)은 IP헤더의 프로토콜과 유사함.
수신처 MAC주소는 Gateway의 IP주소임. 근데 이걸 어떻게 MAC주소로 변환할까?
ARP의 개념은 간단함. 이더넷에 연결되더있는 모두에게 패킷을 전달하는 브로드캐스트라는 구조가 있음.
이를 이용하여 aaa.bbb.ccc.ddd 라는 IP를 가진 사람 있습니까? 하고 물어보면, MAC 주소를 알려줌.
그런데, 의문이 생겼다. IP만 있으면 어차피 호스트 넘버로 구분 가능한데, 왜 MAC 주소가 필요할까?
MAC 주소는 로컬 네트워크에서 사용하는 단위. 계층이 다름. IP주소는 로컬이 아닌 네트워크에서 사용함.
따라서 IP를 찾아 간 후, MAC 주소를 찾아가게 됨.
아무튼 ARP를 이용해 IP와 MAC주소를 대응시킴. 이걸 반복하면, 자원낭비. 따라서 한번 매칭시킨 데이터는 ARP 캐시라는 메모리영역에 저장.(일정시간 후 삭제)
패킷은 결국 메모리 영역의 데이터. 이를 직접 전달하기란 불가능. 따라서 전기나 빛신호로 변환해야함.
이것을 실행하는 것이 LAN 어댑터. 구조는 이렇게 이루어져있다.
바로 사용하는게 아니라 LAN 드라이버로 초기화 작업거침. MAC주소 설정...
맨앞 두개
맨 뒤 하나
프리앰블은 패킷이 시작되는 타이밍을 잡기위한 56bit짜리 파형.
디지털 데이터를 1과 0으로 전기신호를 보내 이걸 다시 디지털 데이터로 변환해야함.
이때 문제가 있음. 1,0,1,0 이렇게 오면 판단하기 쉬운데, 1이 연속되거나 0이 연속되는 신호는 변화가 없어져서 비트 구분을 판단할 수 없게됨.
이때 사용하는것이 클록 신호. 일정한 주기로 나타낸 신호. 원본 데이터 신호와 합성.
클록신호의 타이밍을 판단하는것이 중요한데, 이 타이밍을 잡기 위한것이 프리앰블.
스타트 프레임 딜리미터는 패킷의 시작을 나타냄.
FCS 데이터의 오류나 변화를 검출하기 위해 고안됨. 데이터가 1bit라도 변하면 값이 달라짐.
허브는 2가지방식이 있음
1. 반이중 모드
전기신호가 흐르지 않을때 송신 동작 시작. MAC 회로가 프리앰블의 맨 앞 비트부터 읽기 시작함.
이것을 PHY(MAU. 송수신회로)로 보냄. 이때 디지털 - 전기 신호변환 속도가 곧 전송 속도임.
ex) 10mb/s
MAC 회로는 PHY(MAU)가 읽을수 있는 형태로 변환. PHY(MAU)가 각 케이블마다 알맞은 신호형식으로 변환시켜줌. 또한, 송신작업중 수신이 들어온다면 재밍으로 수신하지말라 알린 후 대기 시간을 가짐.
수신은 위의 과정과 역순으로 일어남. 또한 리피터 허브는 누군가 신호를 보내면 그것이 전부 수신 신호선에서 흘러옴.(다른 PC들도 필요없지만 받게됨)
간단하게 짚고 넘어가보자. UDP는 TCP의 방식에 비해 간단하다
TCP는 오류가 생기면 어느부분에 생겼는지 파악하고, 다시보낸다. 근데 아주 짧은 패킷이면 전체를 다 보내도 자원낭비가 거의 없음. 따라서 이땐 UDP를 사용함. UDP는 접속,끊기 등의 행위가 없다.
따라서 그냥 보내고, 회답이 안오면 다시 보낸다.
=> UDP의 속도가 TCP보다 빠를 수 밖에 없음.
또한, 음성, 영상등. 지연시간을 낮추고 빨리 전달해야하는 데이터는 모두 UDP로 보냄.
글 잘 봤습니다, 감사합니다.