TCP/IP 중에서 IP protocol이 해당하는 계층. end-to-end 통신이 네트워크 층의 메인 기능이고, IP의 목적은 첫째로는 호스트 간의 통신, 네트워크가 복잡해도 최종 수신지까지 패킷을 전달하는 것이다.
호스트
IP주소를 갖고 있는 기기. ...인데 여기서 경로 제어??를 하지 않는 것. 이걸 라우팅이라고 한다고 함....
그래서 라우터는 호스트에 해당하지 않는다고 한다.
패킷?
데이터를 한 방에 보내줄 수만 있다면 정말 행복하겠지만...네트워크는 다른 컴퓨터들과도 통신을 진행해야 하고 혹여 에러라도 생기면 처음부터 다시 전송을 시작해야 한다. 하나의 컴퓨터와 통신을 할 때 한 번에 데이터를 전송하려 하면 다른 컴퓨터들은 영겁의 시간을 견뎌야 한다.
그래서 데이터를 쪼개서 이걸 전송하게 되었는데, 이 쪼개진 데이터를 패킷(packet)이라고 하고, 이것을 Fragmentation(단편화)라고 한다.
이더넷에서는 데이터 전송 단위를 frame, ip에서는 datagram, tcp에서는 segment라고 하는데 전부 나눠서 보내게 되기 때문에(근데 이더넷은 상대적으로 보낼 수 있는 용량이 컸던 것 같음?) 이걸 총칭해서 packet이라고 한다.
IP 헤더
보면 알겠지만 IPv4보다 IPv6가 오히려 훨씬 간소화되었다. 왜인지는 모르겠음.
위에 색깔이 있는 거에는 bits만 명시되어있고 바이트 오프셋은 명시가 안 되어 있는데 바이트 오프셋은 뭐지?
- Version: IPv4 or IPv6. IPv6를 지원하지 않는 서비스들이 있기 때문에 점진적으로 바꿔나가는 중인 모양. 2011년 경에 모든 IPv4 주소가 소진되었다고 하고 이것 때문에 IPv6(128bit로 구성)가 생기게 되었다고 한다. 중국에서는 ADDA를 사용하기도 한단다...
- IHL: Internet Header Length. 헤더의 길이를 명시한다.,......는데 명시를 왜 해줘야하는거지.........
- TOS: Type of Service. 라우터 관점에서 패킷의 우선순위를 선정하는 것인데, 최근엔 Differentiated Service? 라는 이름으로 바뀐 듯 하다.
- Total Length : 헤더부터 payload 까지의 길이를 표시. 16bit이므로 최대 65535까지의 값을 가진다.
- ID : 현재 데이터그램의 고유 식별자. 랜덤값으로 정해지는 모양
- Flag : 3bit로 패킷의 단편화 확인을 위해 사용한다고 함.
- 첫 번째 비트는 예약되어 있다. 항상 0. 근데 왜지?
- 두 번째 비트는 Don't fragment? 의 약자인 D. 1일 때는 패킷이 미분할되었음을, 0일 때는 분할되었음을 의미한다.
- 3번째 bit : More fragment?의 약자인 M. 1일 때는 더 있음을, 0일 때는 마지막 패킷임을 의미한다.
- TTL : 패킷이 건너갈 수 있는 라우터의 수. 하나 지날 때마다 1씩 깎이게 되고 0이 되면 패킷은 drop 한다. ( 라우터 1개를 지나는 것을 1홉이라고 한다. ) 왜 하는건가 싶었는데 패킷이 무한으로 순환하는 일을 막아준다고 한다. 캐시 성능 향상에도 기여를 한다는 데 이건 왜인지 모르겠군.... DNS에서도 사용이 된다고 함.
- Protocol : payload에 들어있는 데이터의 프로토콜을 알려준다.
- ICMP : ping! IP의 부족한 신뢰성을 이 친구가 보완했다고 한다. 구글 서버로 icmp 패킷이 들어오면 방화벽에서 막아버린다...는데 네트워크 상태를 진단하는 등의 긴밀한 기능이 있어서 그런걸까? 윈도우에서도 icmp를 개인 방화벽 선에서 차단하고 있는데 왜지? 2003년 1월 경에 블래스터 웜이라는 바이러스가 Ddos 공격에 ping 명령어를 사용한 이후로 ping 명령어를 열어두는 것이 공격에 활용될 소지가 있다고 판단해 관리 차원에서 명령어를 막아버린 것 같다.
- UDP : TCP 와 함께 같이 언급되는 프로토콜이다. ← 속도가 TCP에 비해 빠른데 신뢰성은 부족해서 스트리밍 서비스에서 주로 쓴다고 들음.
- TCP : 우리가 사용할 프로토콜이다.
- 다른 프로토콜은 나중에 추가로 찾아보자....
- Checksum(검사합) : 송신 측에서 모든 데이터를 16bit로 만든 다음에 1의 보수를 취해 결과를 전송하면 받는 곳에서 같은 식으로 계산한다고 함. 간단한 방식이긴 한데 순서가 바뀌는 오류는 검출하지 못한다고 한다.
- Source Address : 보내는 곳의 IP 주소.
- Destination Address : 받는 곳의 IP 주소.
IP 주소
네트워크 연결 페이지를 열어서 서브넷 마스크나 이런걸 입력하다보면 255.255.255.0 ←이런 걸 볼 수 있는데 이건 IPv4에 해당하고 IPv6는 여기에 두 개의 옥텟을 더 추가한다.
이때 각 자리(이걸 옥텟octet이라고 한다)의 수는 0부터 최대 255까지 가능한데, 왜냐면 8진수 4자리로 구성이 되어있기 때문이다.
255.255.255.0을 이진수로 변환하면 11111111.11111111.11111111.00000000이 되고 이는 2^8이 되어 각 자리(즉, 11111111 혹은 00000000)에서는 최대 256개의 다른 값을 넣을 수 있고, 이것이 0부터 255에 해당하는 값이 되기 때문이다.
위에 헤더를 보면 32bit의 source address와 destination address가 있는 것을 볼 수 있는데, 여기에 16bits로 구성된 ip 주소가 들어가게 되는 것이다.
A 클래스 ← 국가 이상의 큰 통신망에서 사용
- A Class는 최고위의 Class로서, 1~126 (0, 127 예약됨...인데 이건 밑에서 나온다)범위의 IP주소를 가진다. 두 번째, 세 번째 그리고 네 번째 단위의 세 숫자는 A Class가 자유롭게 네트워크 사용자에게 부여가 가능한 아이피이다.
- naver.com의 IP 주소는 125.209.222.142 라고 나온다.
B 클래스 ← 학교 등 중대규모 이상의 통신망에서 사용
- B Class는 두 번째로 높은 단위의 Class로써, 아이피 구성에서 첫 번째 단위의 세 숫자는 128 - 191 가운데 하나를 가지며 (위의 예에서 181), 두 번째 단위의 세 숫자는 B Class가 접속할 수 있는 네트워크를 지시한다.
- google.com의 IP 주소는 172.217.25.228 라고 나온다.
- google.co.kr의 주소는 172.217.174.99라고 나온다. 근데 redirect는 google.com 으로 된다. 뭐지?
C 클래스 ← 소규모 회사 등에서 사용
- C Class는 최하위의 Class로서, 아이피 구성에서 첫 번째 단위의 세 숫자는 192 -223 가운데 하나를 가지며 (위의 예에서 221), 두 번째와 세 번째 단위의 세 숫자는 C Class가 접속할 수 있는 네트워크를 지시한다. C Class가 자유로이 부여할 수 있는 아이피는 마지막 네 번째 단위의 254 개이다.(2개는 예약)
class D는 멀티캐스트용, class E는 연구/예약 용도로 사용된다는데, 실제로 사용되는 경우는 거의 없다고 함.
유니캐스트 / 멀티캐스트
유니캐스트(Unicast)
유니캐스트는 정보를 전송하기 위한 프레임에 자신의 MAC 주소와 목적지의 MAC 주소를 첨부하여 전송하는 방식을 말한다. 어떤 시스템이 유니캐스트 방식으로 데이터를 전송하게 되면 같은 네트워크에 있는 모든 시스템들은 그 MAC 주소를 받아서 자신의 MAC 주소와 비교 후에 자신의 MAC 주소와 같지 않다면 프레임을 버리고 같다면 프레임을 받아서 처리하게 된다. 유니캐스트 방식은 가장 많이 사용하는 방식으로 한 개의 목적지 MAC 주소를 사용하고 CPU 성능에 문제를 주지 않는 방식이다.
멀티캐스트(Multicast)
멀티캐스트는 네트워크에 연결되어 있는 시스템 중 일부에게만 정보를 전송하는 것으로 특정 그룹에 속해 있는 시스템에게만 한 번에 정보를 전송할 수 있는 방법을 말한다. 멀티캐스트는 라우터가 멀티캐스트를 지원해야만 사용 가능하다는 단점이 있다.
그룹 통신을 위하여 다중 수신자들에게 동일한 데이터를 전송하고자 할 경우 유니캐스트 전송 방식을 이용한다면 전송하고자 하는 데이터 패킷을 다수의 수신자에게 각각 여러 번 전송해야 하며, 이러한 동일한 패킷의 중복 전송으로 인해 네트워크 효율이 저하된다. 또한 수신자 수가 증가할 경우 이러한 문제점은 더 커지게 된다. 반면 멀티캐스트 전송이 지원되면 송신자는 여러 수신자에게 한 번에 메시지가 전송되도록 하여 데이터의 중복 전송으로 인한 네트워크 자원 낭비를 최소화할 수 있게 된다.
멀티캐스트 전송이 일반적인 유니캐스트 인터넷 응용 분야와 다른 점은 우선 그 전송 패킷에 있다. 일반적으로 TCP/IP 상의 인터넷 응용 프로그램은 데이터의 송신자가 이를 수신할 수신자의 인터넷 주소를 전송 패킷의 헤더에 표시해 패킷을 전송한다. 그러나 멀티캐스트 전송을 위해서는 헤더에 수신자의 주소 대신 수신자들이 참여하고 있는 그룹 주소를 표시하여 패킷을 전송한다.
유니캐스트는 그냥 거의 대체로의 통신이 그렇듯이 1:1 메시지 전송 시스템인 것 같고 멀티캐스트는 그걸 복수적으로 수행할 수 있는 것 같음. 인터넷 방송에 관한 이야기가 굉장히 많이 나오는데 UDP를 많이 쓰는건가? 싶은데 어떤지 모르겠네. 일단 게임에서는 제법 쓴다고 들었음.
사설 요리
근데 왜 하필 localhost는 127.0.0.1인 거지?
의문이 생기는 것이다.
- 왜 하필이면 초기값도 아니고 첫째 옥텟은 A 클래스 내에서 최댓값으로 선정했는가?
- 왜 나머지 옥텟값은 첫째 옥텟을 제외하고 두 번째로 작은 0.0.1을 택했는가?
- 객관적으로 생각하면 0.0.0.0으로 하는 게 개발 측면에서 훨씬 편하지 않았을까?
- 와중에 얘가 class A여야 하는 이유가 있나? 다른 데로 들어가거나 클래스를 하나 빼도 괜찮지 않나?
마침 또 좋은 자료가 있다.
일단
- locahost: = 127.0.0.1 = 0.0.0.0은 같은 위치를 바라보고 있다. express-generator로 구축한 페이지를 localhost:3000 에서 돌렸을 때나 127.0.0.1:3000에서 돌렸을 때나 0.0.0.0:3000에서 돌렸을 때나 모두 동일한 페이지가 출력되는 것을 확인했다.
- 0.0.0.0은 유효한 주소 구문이기는 한데 저...모든 숫자가 00000000이면 특정 상황에서 적합하지 않다고 취급할 수 있다고 한다.
- 왜 그렇게 설정을 한 건데 왜 많고 많은 애들 중에 하필이면 애를 선정한거지?
- 127.0.0.0은 wire number가 되기 때문에 사용할 수 없다. 대신 다른 건 괜찮다!
- 가령 127.1.1.1도 바꾸기만 한다면 가능하다.
- 1981년 경에는 A 클래스로 유일하게 0과 127만이 있었는데, 0은 특정한 호스트(어딘데?)를 가리켜야 했고, 127이 남았기 때문에 이것이 loopback에 사용되기 시작했다...라고는 하는데
- 아니 그럼 0.0.0.0이랑 127.0.0.1이랑 같은 포트에서 같은 사이트를 띄우는 이유가 뭐냐고
- localhost는 127.0.0.1로 루프백하게 되어있는데 왜 0.0.0.0에서 똑같은 동작을 하는 거야....ㅠ.ㅠ. 127.0.0.1은 내부에서만 접근 가능한 주소이고, 0.0.0.0는 포트포워딩을 할 경우 외부에서도 접근이 가능해진다.
'KNOWLEDGE > NETWORK' 카테고리의 다른 글
VPN - Virtual Private Network (0) | 2023.12.30 |
---|---|
OSI 7계층 - 전송 계층 (0) | 2022.01.01 |
OSI 7계층 - 데이터 링크 계층 (0) | 2021.12.31 |
OSI 7계층 - 물리 계층 (0) | 2021.12.31 |
OSI 7계층의 시작 (0) | 2021.12.31 |