TCP/IP 계층은 다음과 같습니다.
계층 | 데이터 전송 단위 | 주요한 프로토콜 | 비고 |
응용 | 메시지 | 약 65,000개 | 송신 시작 계층 |
전송 | 데이터그램/세그먼트 | UDP와 TCP | |
네트워크 | 패킷 | IP와 ICMP등 | |
데이터 링크 | 프레임 | 이더넷과 PPP 등 | |
물리 | 비트 | 수신시작 계층 |
프로토콜은 호스트와 호스트사이에서 사용하는 일종의 언어와 같은 개념입니다.
여기서 계층은 비음성 통신에서 데이터를 전송하기 위한 일련의 과정이나 단계 또는 절차입니다.
그럼 이 계층을 상세하게 살펴보도록 하겠습니다.
응용 계층
TCP/IP방식은 음성 통신이 아닌 비음성 통신을 구현하기 위한 과정입니다.
다시 말해 사람이 아닌 운영체제가 통신의 주체라는 뜻입니다.
그렇기 때문에 운영체제가 수신자에게 데이터를 전송할 뿐만 아니라 전송할 데이터를 생성해줍니다.
이처럼 전송하고자 하는 데이터, 즉 페이로드를 생성해주는 계층이 응용 계층입니다.
(편지의 내용을 쓰는 거죠.)
이 응용 계층에는 이론상 65,536 개에 이르는 페이로드 생성 프로토콜이 있습니다. (16비트)
이때 운영체제에서는 응용 계층에 속하는 프로토콜을 고유한 식별 번호로 인식하는데 이가 바로 포트 번호 입니다.
다시 말해 인터넷 공간에 존재하는 무수한 LAN영역을 구분하기 위해 네트워크 ID 라는 개념을 이용하는거처럼 무수한 프로토콜을 구분하기 위해 응용계층에서는 포트번호로 구분을 하는 겁니다.
구분 | 명칭 | 비고 |
0~1,023 | 잘 알려진 포트 번호 | 주로 서버 측에서 사용 |
1,024~49,151 | 등록 포트 번호 | 주로 클라이언트 측에서 사용 |
49,152~65,535 | 사설 또는 동적 포트 번호 | 주로 클라이언트 측에서 사용 |
포트 번호는 윈도우는 'C:\Windows\System32\drivers\etc\protocol"에 있습니다. 메모장으로 열어보면 다음과 같이 보이겠죠.
리눅스는 cat /etc/services 로 볼 수 있습니다.
포토 스캔이란 원격지 호스트를 대상으로 어떤 포트 번호를 사용 중인가를 확인하는 기법입니다. 어떤 포트가 활성화 되었는지 보기 위해 원격지에 있는 클라이언트에서는 해당 서버로 직접 DNS 를 요청하지 않고 엔맵(Nmap) 이라는 포토 스캐너를 이용해서 해당 포트의 활성화 여부를 알 수 있습니다.
전송계층
응용계층에서는 무수한 프로토콜(65000여개) 가 있었습니다. 하지만 이와 달리 전송계층에서는 단 2개의 프로토콜만이 있습니다. 바로 UDP와 TCP 입니다. 이 둘의 차이점은 단편화와 버퍼링의 유무였습니다. (TCP 가 있습니다.)
UDP 는 응용계층에서 페이로드를 생성하고 전송계층에서 출발지,목적지의 포트번호 헤더를 붙인 후 (데이터 그램/ 세그먼트) 네트워크 계층으로 넘깁니다. 512바이트 미만의 작은 페이로드를 대상으로 하기 때문에 괜찮습니다. 버퍼링과 단편화가 없으니깐요.
이때까지 UDP 에 관점에서 전송을 설명했지만 여기서는 TCP의 전송 과정도 확인해보겠습니다.
TCP 는 예상처럼 UDP 보다 복잡합니다.
만약 1,024바이트의 TCP를 보낸다고 해봅시다. 일단 전송 전에 3-way handshaking 과정을 진행합니다.
페이로드는 응용계층에 버퍼에 임시로 저장을 합니다.
전송 계층에서 SYN 신호를 담은 세그먼트 1개를 생성합니다.
SYN 세그먼트는 네트워크 계층과 데이터 링크 계층을 차례로 통과하면 헤더를 붙입니다.
그리고 물리 계층에서 비트 단위로 변환해서 목적지로 나갑니다.
즉 SYN 세그먼트는 다음과 같은 모양을 띌 겁니다.
SYN 신호를 담은 세그먼트 헤더 | IP 패킷 헤더 | 이더넷 프레임 헤더 |
수신 측 호스트는 SYN 신호를 전송 계층까지 올린 후 SYN/ACK 신호를 담은 세그먼트를 1개 생성해 출발지에 보냅니다.
SYN/ACK 신호를 담은 세그먼트 헤더 | IP 패킷 헤더 | 이더넷 프레임 헤더 |
그리고 예상하시다시피 마지막으로 ACK신호를 송신 측에서 보냅니다.
ACK 신호를 담은 세그먼트 헤더 | IP 패킷 헤더 | 이더넷 프레임 헤더 |
이렇게 수신 측과의 연결을 확립하면 운영체제는 응용 계층 버퍼에 저장한 TCP 페이로드를 전송계층으로 넘깁니다.
그리고 이를 대상으로 단편화를 진행합니다.
단편화는 전송 효율성과 데이터 기밀성을 위해 TCP 페이로드를 여러 개로 분할하는 겁니다.
여기서는 512바이트로 2개씩 쪼갠다고 가정합니다.
각 2개의 세그먼트에 앞에는 목적지 출발지 포트번호가 담긴 헤더가 붙습니다. 그리고 각자 네트워크 계층으로 넘어가 각자의 패킷을 생성합니다.
전송이 무조건 응용 계층부터 시작한다는 생각은 버려야합니다. SYN 신호처럼 전송 계층에서 출발하는 경우도 있습니다. 경우에 따라서는 네트워크 계층에서 출발하는 경우도 있습니다.
그리고 다 출발한 계층에서 끝이 나게 됩니다.
UDP 헤더의 크기는 8바이트로 고정입니다.
출발지, 목적지 포트번호는 16비트를 이루는데 프로토콜의 종류가 65,536 개인 이유가 됩니다.
포트번호 다음에 길이(length) 항목에는 페이로드와 헤더를 더한 데이터그램의 크기 정보가 나옵니다.
다음 오류 검사(checksum) 항목은 기본적으로 비활성상태입니다.
이렇게 포트번호/길이/오류검사로 이루어집니다.
반면 TCP 는 이보다 복잡합니다.
UDP 는 8바이트로 고정이지만 TCP 는 가변적입니다.
출발지 목적지 포트 16비트 씩 입니다.
일련번호(sequence number)
확인번호(acknowledgement number)
는 3단계 연결 설정과 관련입니다. (3-way handshaking)
SYN 신호를 생성할때는 일련번호 확인 번호가 각각 0 입니다.
SYN/ACK 일때는 0 1
ACK 일때는 1 1입니다.
오프셋은 TCP 헤더의 길이를 담습니다.
일반적으로 20입니다.
FLAG 는 SYN 또는 FIN 과 같은 신호 정보를 저장합니다.
window 는 흐름제어기능과 관련있습니다. 플래그와 윈도는 밀접한 관계가 있습니다.
예를 들면 송신자가 데이터를 1~20번 까지 보낼 때 데이터를 오류가 날 걸 대비해 버퍼에 저장합니다. 정상적으로 수신하면 수신자는 ACK 플래그를 보냅니다. 21번부터 보내라는 겁니다. 그럼 송신자는 버퍼를 비우고 21번부터 60번까지 다시 버퍼에 저장합니다. 이때 혼잡과 부하 등으로 21번~ 40번 까지만 데이터를 수신했다고 하면 윈도 항목에 41번을 담아 ACK/CWR 플래그로 응답을 보냅니다. CWG 플래그는 혼잡 윈도 크기 감소 신호입니다. 즉 못 받았으니 전송 데이터를 줄여서 보내라는 뜻입니다. 그럼 송신자는 버퍼에 저장한 데이터 중 41번부터 60번까지 재 전송합니다.
이처럼 송신자는 수신자의 확인 응답에 따라 전송할 정보의 양을 조절하는데 이를 혼잡 윈도라고 하며 송신자가 전송할 수 있는 동적인 정보의 양을 슬라이딩 윈도(Sliding window)라고 합니다.
윈도 항목은 최대 5840 이라고 알려져 있습니다.
확실히 udp 보다 는 tcp 가 복잡합니다. 이를 잘 정리해두어야합니다!
네트워크 계층
네트워크 계층에서는 각 세그먼트 앞에 IP 주소를 주요한 정보로 하는 헤더를 추가하면서 2개의 IP 패킷을 생성합니다.
IP 헤더도 TCP 헤더와 동일하게 가변적입니다. 일반적으로 20바이트 크기를 사용하지만 경우에 다라 추가 (IP Option) 을 이용해 더 많은 바이트를 사용하기도 합니다.
1. 버전(Version) : IPv4면 4 , IPv6이면 6
2. 헤더길이(Header Length) : IP 헤더의 크기
3. 서비스종류(Service type) : 해당 패킷의 전송 우선순위를 저장
-> 우선순위 설정하면 회선이 혼잡할 때도 해당 패킷을 우선적 전송해줌
4. 전체 길이(Total Length) : IP 헤더 포함한 패킷의 전체 길이 정보
5. ID(identification) , IP 플래그, 프래그먼트 오프셋 : MTU 에 따른 패킷 분할 정보 담는 항목
MTU(Maximum Tranmission Unit) 은 최대 전송 단위, 즉 각 프로토콜에서 정한 데이터 크기의 최대 범위를 뜻함
만약 MTU 를 넘은 데이터가 발생하면 ID 항목과 플래그 항목 그리고 프로그먼트 오프셋 항목이 필요.
IP헤더 플래그는 패킷의 분할 유무를 표시
만약 MTU가 1500인데 5900바이트의 패킷이 이더넷 구간을 통과하고 싶게 할려면 100바이트의 쓰레기값을 채워야한다.(Padding, 패딩) 그리고 1500바이트씩 4개로 나눈다.
ID 항목 | 플래그 항목(D 비트) | 플래그 항목(M 비트) | 프래그먼트 오프셋 |
1234 | 0 | 1 | 0 |
1234 | 0 | 1 | 1,500 |
1234 | 0 | 1 | 3,000 |
1234 | 0 | 0 | 4,500 |
D 비트는 'Do not fragment'
M 비트는 'More fragment'
라는 의미입니다.
보면 첫번째 패킷에 플래그 항목 M 을 보면 분할을 해주어야하는 걸 알 수 있습니다.
오프셋이 0인걸 보면 시작 위치가 0바이트인 걸 알 수 있죠.
두번째 패킷도 분할 패킷이고 또 분할할게 있다는 걸 알 수 있습니다. 오프셋이 1,500바이트기 때문에 첫번째 패킷이 0~1,499로 끝나는 패킷이었음을 알 수 있습니다.
세번째도 동일하게 두번째 패킷이 1,500바이트에서 시작해 2,999바이트로 끝나는 1,500바이트짜리 패킷임을 알 수 있습니다.
네번째는 이제 M 비트가 0이기 때문에 분할할 패킷이 없다는 걸 알 수 있습니다. 이게 마지막 패킷인 거죠. 오프셋이 4,500 바이트인걸 보니 3,000바이트에서 시작해 4,499바이트로 끝나는 1500바이트 패킷임을 알 수 있네요.
이런 과정을 패킷분할(Packet Fragment) 라고 하는데 빈번하면 과부하의 요인이 되기도 합니다.
또 IP 헤더에서 사용하는 프래그먼트 오프셋 항목에 담긴 정보가 애매해지면 수신 측에서 분할 패킷을 재조립할 때 비정상적으로 처리할 수 있습니다. 이와 같은 공격을 '본크/보인트 공격'이라고 하고 패킷 단위에서 재조립이 일어나는 특징을 악용한 공격을 '티얼드롭 공격'이라고 합니다.
6. 생존시간(TTL,Time to Live) : 라우팅 루프가 일어난 구간에서 패킷을 폐기하기 위한 용도, 즉 해당 패킷이 통과할 수 있는 라우터의 개수 정보를 담는 항목이다.
예를 들어 TTL 이 10이면 10대의 라우터를 통과할 수 있다는 말이고 이를 넘으면 통과할 수 없다는 겁니다.
7. 프로토콜(Protocol) : 상위 계층에 속한 프로토콜 번호를 저장
만약 송신 측에서 UDP 페이로드 설정했다면 17로 설정, TCP 페이로드 생성했다면 6으로 설정
조금 더 다양한 프로토콜 번호는 다음 위키피디아에서 살펴볼 수 있습니다 .
https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
8. 헤더 오류 검사(Header Checksum) : UDP/TCP 헤더와 마찬가지로 비활성 상태
9. 출발지 주소 항목과 목적지 주소 항목의 크기는 32비트로서 각 IP 를 저장
IP 주소에 대한 이야기를 다시 해볼까요?
아시다시피 IP 주소의 범위는 0부터 255까지 입니다.
0.0.0.0부터 255.255.255.255 까지 총 비트로 이루어진 체계입니다.
IP 주소는 보통 A등급부터 C 등급까지 사용합니다. 이는 첫번째 자리를 통해 구분합니다.
등급 | 범위 | 기본 서브넷 마스크 | 비고 |
A | 1~126 | 255.0.0.0 | 루프백 주소 127.0.0.1 |
B | 128~191 | 255.255.0.0 | |
C | 192~223 | 255.255.255.0 |
표에 나와 있는 기본 서브넷 마스크처럼 각 등급마다 네트워크 ID 와 호스트 ID 가 다릅니다.
네트워크 ID 란 LAN 영역에 고유 식별자
호스트 ID 란 해당 LAN 영역에서 호스트를 구분해주는 고유 식별자입니다.
특히 호스트 ID 에서 모든 비트가 0인 경우를 네트워크 IP 주소라고 합니다.
(C등급에서 192.168.10.0, B등급에서 128.68.0.0 인 경우)
모든 비트가 1인 경우를 브로드캐스트 IP 주소라고 합니다.
(C등급에서 192.168.10.255, B등급에서 128.68.255.255 인 경우)
이 주소는 운영체제 내부에서 사용합니다. 실제 사용 가능한 IP는 이 두개를 뺀 거 겠죠?
리눅스 기반 운영체제는 다음 설정을 통해 브로드캐스트 IP를 확인할 수 있습니다.
윗 부분은 브로드 캐스트 ip 주소를 사용하기 위해 선행적으로 설정해주어야합니다. 아래 부분은 모든 같은 네트워크 ID 를 가진 호스트에서 ICMP를 요청하겠다는 의미 입니다. 이처럼 브로드캐스트 IP 속성을 악용한 공격을 ICMP 스머핑 공격이라고 합니다.
IP주소의 고갈로 사설 IP 주소가 생겨났습니다. 이는 LAN 전용 주소입니다. 내부 IP 주소라고 불리기도 해요. 전체 IP 중 사설 IP 주소를 제외한 나머지를 공인 IP주소라고 합니다.
등급 | 범위 |
A | 10.0.0.0 255.0.0.0~10.255.255.255 255.0.0.0 |
B | 172.16.0.0 255.255.0.0 ~ 172.31.255.255 255.255.0.0 |
C | 192.168.0.0 255.255.255.0 ~ 192.168.255.255 255.255.255.0 |
위 는 사설 IP주소 표입니다.
사설 IP 주소는 전용 LAN 영역임에도 불구하고 인터넷 접속이 가능합니다.
NAT 라는 기법 때문인데요.
NAT (Network Address Translation) 은 출발지 사설 IP 주소를 출발지 공인 IP 주소로 바꿔줍니다. 보통 라우터 같은 장비에서 이를 사용하죠.
라우터는 무선 공유기를 의미하는데 NAT 기능을 수행하는 장치입니다.
NAT 에 포트번호 주소를 연동해서 사용할 경우 이를 PAT(Port Address Tanslation)입니다.
PAT를 이용하면 이론적으로는 1개의 공인 IP 에 65,536개의 사설 IP주소를 연결 시킬 수 있습니다.
즉 이는 65,536 개의 IP 주소가 필요한 LAN 인데 공인 IP 주소 하나면 가능하다는 겁니다. (와우)
보통 둘이 NAT 로 통칭한다고 합니다.
사설 IP 주소를 이용하면 NAT 기법을 통해 외부로 나갈 순 있지만 외부에서는 실제 내부 IP 주소를 사용하는 PC 로 접근이 불가능합니다. 공인 IP 주소까지는 접근이 가능합니다.
근데 정말 아예 불가능 할까요?
포트 포워딩(port forwarding)을 설정하면 가능합니다.
PAT 기법을 응용해 외부에서 내부로 접근할 수 있도록 설정하는 기법입니다.
다음과 같이 설정하면 외부에서 공인 IP 주소를 치면 사설 IP 주소로 접속할 수 있습니다.
네트워크 계층에서 IP주소 만큼 중요한 ICMP 에 대해 알아봅시다.
그림 3-1 에서 ARP 동작을 설명하면서 소개한 ping 명령어는 ICMP 라는 프로토콜에 기반합니다.
ICMP(Internet Control Message Protocol) 는 IP 등장 후 전송 작업을 화명에 출력하기 위한 용도로 등장했습니다.
ping 명령의 결과를 화면에 볼 수 있는 것도 이 이유 때문인거죠.
이처럼 ICMP는 화면 출력 메시지에 기반해 오류 통보 기능과 질의 응답 기능 등을 수행하기 위한 프로토콜입니다.
ICMP 에 대해 좀 더 알아봅시다!!!
ICMP 식의 오류 통보는 뭘까요?
이는 전송 중 일어날 수 있는 목적지 도달 불가나 발신지 억제 또는 시간 초과나 매개변수의 문제 등을 사용자 화면에 출력하기 위한 기능을 의미합니다. 사용자 입장에서는 그래도 오류 탐지 보단 질의 응답 기능이 중요하겠죠?
목적지 호스트가 내 눈에 안 보이는 곳이라면 어떻게 확인 할까요? 이러면 쓰레기 값으로 이루어진 데이터를 생성해 ping 명령어로 전송합니다. 목적지 호스트가 동작 중이면 응답이 옵니다.
ICMP 프로토콜은 네트워크 계층에서부터 페이로드를 생성합니다.
쓰레기 값으로 채워진 페이로드 앞에 ICMP 8 바이트 크기가 붙습니다.
타입(type) : 요청(8)인지 응답(0)인지 구별
이렇게 페이로드 뒤에 헤더가 붙고 난 후 IP 헤더가 붙습니다.(라우팅을 해야하니깐)
그리고 데이터 링크 계층과 물리계층으로 넘어갑니다.
ICMP 기반의 명령어가 하나 더 있는데 tracert 입니다.
ping 이 출발지와 목적지 사이의 통신 여부 점검이라면 tracert 는 출발지와 목적지 사이의 라우팅 과정 확인입니다.
데이터링크 계층
원래 TCP/IP 네트워크에 이 계층은 없었습니다. LAN/WAN 기술의 발전에 의해 생겨난 것 입니다. 그래서 이 둘은 같은 프로토콜을 사용합니다.
스위칭 통신을 구현하는 LAN 영역에서는 이더넷 방식(사실상 표준)을 비롯해 토큰 링(Token ring) 방식과 FDDI(Fiber Distributed Data Interface) 방식 과 LAN/WAN 을 통합한 ATM(Asynchronous Transfer Mode) 방식이 있습니다.
라우팅 통신을 구현하는 WAN 영역에서는 HDLC(High-Level Data Link Control) 방식,PPP(Point-to-Point Protocol) 방식 ,X.25 방식과 프레임 릴레이(frame relay) 방식, ATM 방식이 있습니다. WAN 은 표준이 없기 때문에 프로토콜 설정에 주의 해야합니다.
이번에는 ARP 프로토콜에 초점을 두고 이야기를 하겠습니다.
보면 ARP 프로토콜에는 페이로드 영역이 없고 오직 헤더로만 이루어져있습니다.
주요 정보는 IP/맥 주소인데 데이터 링크 계층을 생성하고 LAN 영역에서 사용하는 맥 주소와 네트워크 계층에서 사용하는 IP 주소를 연결했기 때문입니다.
물리 계층
응용,전송,네트워크,데이터링크 계층에서 생성한 모든 데이터 단위는 물리 계층에서 비트 단위로 전환됩니다. 이 계층은 하드웨어 전반과도 관련이 깊습니다. 기계적, 전기적, 기능적, 절차적 기능 등을 정의하는데 다시 말해 통신에 필요한 신호 방식 또는 전송 대역폭 등을 규정합니다. 전산보다는 전기, 전자 분야에 해당한다고 할 수 있습니다.
TCP/IP 계층에 따라 네트워크 3대 장비인 허브와 스위치, 그리고 라우터를 다음과 같이 분류합니다.
구분 | 관련 계층 | 처리 단위 | 테이블 유무 | 동작 방식 |
허브 | 물리 | 비트 | 플러딩 | |
스위치 | 데이터 링크 | 프레임 | 스위칭 테이블 | 포워딩/플러딩 |
라우터 | 네트워크 | 패킷 | 라우팅 테이블 | 포워딩 |
LAN영역에 허브와 스위치, 라우터가 UTP 회선을 통해 상호 연결 상태라고 가정합니다.
허브 1번 포트부터 4번 포트를 각각 PC 와 스위치에 연결
스위치의 1번 포트부터 4번 포트를 각각 허브와 라우터에 연결
라우터의 이더넷 인터페이스를 스위치에 연결
WAN 영역으로 나가는 라우터의 시리얼 인터페이스에는 PPP 방식을 통해 상대방 라우터와 통신
PC에서 발생한 비트가 회선을 타고 먼저 허브에 도착합니다. 허브에서는 디캡슐레이션 과정이 없기 때문에 수신한 포트를 제외하고 나머지 포토로만 비트형태로 플러딩(flooding)을 하게 됩니다. 이론상 세 장비 중 가장 빠릅니다.
쉽게 말하자면 허브는 가볍게 비트를 뿌리는 거고 스위치는 IP주소와 맥 주소를 통해 PC를 찾아주고 라우터는 LAN 영역 간을 연결해주는 겁니다.
이렇게 TCP/IP 계층에 대해 공부해 보았습니다. 말들이 어려워서 잘 정리해둬야할 거 같아요.
'공부 > 네트워크' 카테고리의 다른 글
TCP/IP 네트워크 공격 유형 (0) | 2020.09.08 |
---|---|
TCP/IP 전송과정을 알아보자(상세정리) (1) | 2020.09.02 |
데이터 전송 단위 (0) | 2020.08.22 |
UDP 방식과 TCP 방식 (0) | 2020.08.21 |
ARP 캐시 테이블 & DNS 캐시 테이블 (0) | 2020.08.20 |