프롤로그
P가 들어가있다? 이건 Protocol을 의심해봐라.
프로토콜
통신에서 송신자가 수신자에게 전송메체를 통해서 메시지를 프로토콜(규칙)을 통해서 전달한다. 라고 배웠었다. 여기서 프로토콜(규칙)이라고 적혀있다.
프로토콜이란 컴퓨터 간 통신을 위해 정해진 규칙과 표준의 집합이다. 규칙이라고 되어있는데, 데이터의 전송 형식, 순서, 오류 처리 방법등이 정의가 되어있고, 통신을 하기 위해서 저 규칙을 따라야 한다.
프로토콜을 왜 지켜야 하느냐?
나는 데이터를 1, 2, 3, 얍! 이렇게 해서 3뒤에있는게 데이터야! 라고 보냈는데, 상대방은 3, 2, 1, 얍! 이렇게 받아들이고, 1뒤에있는 것을 데이터 취급한다고 했으면... 음음...중구난방이다.
그래서 미리 중요한 규칙같은 거 , 데이터 전송규칙들은 다 프로토콜이 정해져있다. 흔히 알고있는 TCP, UDP 이런 애들 맨 뒤에 P자가 들어있지 않는가? Protocol 의 약자이다. HTTP? 맨 뒤에 p가 들어갔네? 프로토콜이다. ftp , IP, ARP등등 뭐 많은데, 아무튼 P가 들어가있으면 프로토콜로 만들어진 규칙인 것이다.
OSI 참조 모델
OSI(Open System Interconnection) 7계층 또는 OSI 참조모델이라고 있는데, 1984년 ISO(International Standard Organization)에서 이기종 컴퓨터들 간의 통신을 가능하게 위하여 개발된 통신 프로토콜이다.
통신의 전 과정을 7개의 계층으로 분리하였는데(아 물론 꼭 7계층일 필요는 없음), 실제 사용되는 프로토콜로는 개발되지는 못했다. 그래서 참조 모델이라고 부른다. 통신 프로토콜을 이해하고 설명하는 기준 모델로 사용되기 때문이다. 현재 사용되는 통신 프로토콜은 TCP/IP 모델.
근데 프로토콜 얘기하다가 갑자기 왜 OSI ?
이 OSI 계층별로 프로토콜의 역할이 나뉘기 때문이다. 각 계층에서 수행해야할 기능을 프로토콜로 정의했다고 보면 된다.
하나의 일을 수행하기 위해 관련 기능들을 모아서 그룹화한 계층화의 개념으로 구성하고, 각 계층은 인접한 계층과 작업을 수행한다.
(1) 물리 계층(Physical Layer)
물리적인 전송로를 제공한다. 데이터를 전기적, 광학적 신호로 변환하여 물리적으로 전송한다. 케이블, 커넥터, 전송 속도 등 물리적 매체를 정의한다.
(2) 데이터 링크 계층(Data Link Layer)
물리적 네트워크 간 신뢰성 있는 데이터를 전송한다. 프레임(Frame) 단위로 데이터 전송 및 오류 감지를 하고 복구하고, MAC 이라는 물리적인 주소를 사용하여 장치를 식별한다.
인접 노드 사이의 데이터 전송 기능을 수행하는데(node-to-node frame delivery), 인접 노드 사이의 오류 제어, 흐름제어, 전송 제어를 한다.
(3) 네트워크 계층
호스트 간의 데이터 전송 기능(host-to-host packet delivery) , 데이터의 전송 경로를 설정(routing)한다.IP 주소를 사용하여 데이터를 목적지로 전달한다.
(4) 전송 계층
데이터 전송의 신뢰성 보장 및 흐름을 제어해준다. 데이터를 세그먼트(Segment) 단위로 나눠서 전송하는데, 이때 TCP/UDP를 사용한다. 종단 간(end-to-end) 신뢰성 있는 데이터 전송을 하고 종단간 오류제어, 흐름제어, 전송 제어를 한다.
(5) 세션 계층
특정 프로세스간에 세션(session)이라는 연결을 확립하고 유지한다. 응용 프로그램 간에 데이터 전송을 위한 동기화, 데이터의 오류 검사 및 복구를 한다. 즉 송신자와 수신자간 세션(연결)을 설정, 유지, 종료하는 역할을 하고 데이터 교환의 동기화 및 복구를 관리한다.
(6) 표현 계층
데이터 형식을 변환하고, 암호화/복호화 또는 압축한다. 사용자가 애플리케이션 데이터를 이해할 수 있도록 변환한다. JPEG, GIF등이 여기 속한다.
(7) 응용 계층
사용자가 네트워크에 접속하는 것을 가능하게 하고, 사용자 인터페이스를 제공한다. 파일이나 이메일 같은 종단 사용자(end user) 서비스를 제공한다. 즉 사용자와 직접 상호작용하는 계층으로 네트워크 서비스를 제공한다.
계층 | 단위 | 설명 |
7. 응용 계층 | 데이터(Data) | 사용자 애플리케이션에서 생성된 데이터. |
6. 표현 계층 | 데이터(Data) | 데이터 형식 변환 후 전달. |
5. 세션 계층 | 데이터(Data) | 세션 관리 후 데이터 전달. |
4. 전송 계층 | 세그먼트(Segment) | 데이터 전송을 위해 나눠진 단위. |
3. 네트워크 계층 | 패킷(Packet) | 네트워크 경로 설정 후 전달되는 데이터 단위. |
2. 데이터 링크 계층 | 프레임(Frame) | 물리 네트워크 간 전송을 위한 데이터 단위. |
1. 물리 계층 | 비트(Bit) | 전기적, 광학적 신호로 변환된 데이터. |
OSI 참조 모델의 목적과 동작
대등-대-대등(Peer-to-Peer process) 이다.
이게 무슨 말이냐? 각 계층 프로토콜은 동일 계층 사이(Peer-to-peer)에 존재한다. 인터페이스 동일한 장치 내에서 다른 계층과 서로 상호작용하는 것이다.
장치 A에서 장치 B로 데이터를 전송할 때, 응용계층에서 표현계층, 세션계층...이렇게 하위계층으로 내려가면서 각 계층에서의 요구조건과 처리 정보를 포함하는 헤더(Header)라는 고유의 제어 정보를 전달 메시지에 추가하여 다음 계층으로 보내는 과정이 있다.
이를 캡슐화라고 한다. 대부분은 앞쪽에 붙으나, 2계층인 데이터링크 계층에서는 헤더 뿐만 아니라 트레일러(Trailer)라고 맨 뒤에 붙어서 전송메체를 통해서 전송이 된다.
반대로 장치 B에서는 온 데이터를 까봐야하는데, 이를 역캡슐화라고 한다.
TCP
TCP(Transmission Control Protocol)이란, 전송계층에서 사용하는 연결 지향형 통신 프로토콜이다.
이 연결 지향형이 중요한데 송신자와 수신자는 데이터 전송 전에특별한 과정을 통해 연결을 설정하기에 굉장히 신뢰성이 높다.
데이터의 신뢰성과 무결성을 보장하고, 데이터 전송 순서를 보장하여 정확한 데이터를 전달하고, 오류 감지 및 재전송 메커니즘을 제공하고, 흐름제어와 혼잡 제어로 안장적인 데이터 전송이 가능하다.
다만 전송속도가 느리고, 실시간에서는 적합하지 않을 수가 있다.
TCP의 기능은 크게 세가지가 있다.
(1) Handshake(핸드셰이크)
방금 위에서 특별한 연결을 먼저 진행하고, 연결이 성공하면 데이터를 상대방한테 보낸다고 했다. 그 특별한 연결방법이 핸드 셰이크 방식이다.
TCP에서 연결을 진행하기 위해서는 3-Way Handshake 과정을 거치고, 연결 종료를 위해서는 4-Way Handshake 과정을 거친다.
3-way handshake
TCP를 연결하기 전에 송신자와 수신자가 3단계 과정을 통해 연결을 설정하는 것이다.
1. syn : 클라이언트가 서버에 연결 요청(syn)을 보냄.
2. syn-ack : 서버가 요청을 수락하며 확인 메시지(syn-ack)를 보냄
3. ack : 클라이언트가 서버의 응답을 확인(ack)하여 연결 완료
왜 이렇게 하냐? 중복에 의한 잘못된 연결이 설정될 가능성을 낮추고, 보안 측면을 고려하기 때문이다. 양방향으로 SYN 메시지를 송수신 하며, 임의의 순서를 사용한다.
이 3 way handshake 를 하는 이유는 결국엔 시퀀스 넘버를 맞춰주기 위해서이다.
4-way handshake
연결을 해제 하는 방식이다.
1. FIN : 클라이언트가 연결 종료 요청 보냄
2. ack : 서버가 요청 확인
3. FIN : 서버가 연결 종료 요청을 클라이언트에게 보냄
4. ack : 클라이언트가 확인하여 연결 종료
이렇게 각 객체간의 독립적인 fin 요청과 ack 로 연결 종료가 이루어진다.
(2) Flow Control (흐름 제어)
상대방이 내가 보낸 데이터를 얼마나 빨리 처리할 수 있는지를 확인한다. 옛날 컴퓨터의 경우에는 버퍼 사이즈를 보는데, 서버입장에서 버퍼가 다 차있는데도 처리해야할 것도 많다? 그러면 보내는 애한테 "너 천천히 보내" 라고 알려준다. 그걸 알려주는 게 뭐 윈도우 사이즈(나 이정도 여유가 있어)인데, 상대방이 데이터를 잘 먹을 수 있냐 없냐를 보는 것이다.
정리하자면, 최종적으로 상대방 서버가 여유가 있는가 없는가를 아는 것이다.
(3) Congestion Control (혼잡제어)
상대방은 데이터를 잘 처리할 수 있다고 치더라고, 가는 길이 꽉 막혀있다면? 그것도 문제다. 중간에 있는 라우터 애들이 데이터를 처리를 못하는 상황인데, 여기다가 데이터를 구겨 넣으면? 뻥 터지는 것이다. 이것을 방지하는 게 혼잡제어 이다. 인터넷 길이 꽉 막혀있나 안 막혀 있나 확인을 하고, 길이 막혀있다면 데이터를 안 보내고, 안 막혀 있는 거 같으면 데이터를 보내는 것이다. 이 혼잡에저 알고리즘이 타호 -> 르노 -> 베가스 등으로 알고리즘은 발전하고 있다.
혼잡하다는 것을 어떻게 판단할 것인가? 데이터를 보내고, 응답이 잘 오면 혼잡하지 않다고 보는 거고, 응답이 오지 않으면? 혼잡하다고 판단하여 보내는 데이터 양을 줄인다.
TCP 헤더
TCP 헤더는 다음과 같다.
총 20바이트이고, 발신지 포트번호 16비트(2바이트), 목적지 포트번호 16비트(2바이트), 시퀀스 넘버 32비트(4바이트), 막 이렇게 된다.
Source Port | 16 | 송신 측 포트 번호 |
Destination Port | 16 | 수신 측 포트 번호 |
Sequence Number | 32 | 데이터 순서를 지정하는 번호 |
Acknowledgment Number | 32 | 수신 측이 확인한 데이터의 다음 순서 번호 |
Header Length | 4 | TCP 헤더의 길이 |
Flags | 6 | 제어 플래그 (SYN, ACK, FIN 등) |
Window Size | 16 | 송신 측에서 수신 측이 처리 가능한 데이터 크기 |
Checksum | 16 | 데이터 무결성 확인 |
Urgent Pointer | 16 | 긴급 데이터가 있을 경우 사용 |
Options | 가변 | 선택적으로 추가 정보 제공 |
데이터를 세그먼트(Segment)로 나누어서 전송하며, 각 세그먼트에는 고유한 순서 번호(Sequence Number)가 포함되는데, 수신자는 받는 데이터를 확인(ACK)하고, 확인되지 않은 세그먼트는 재전송한다. 수신자는 받은 세그먼트를 순서대로 재조립하여 원본 데이터를 복원한다.
UDP
위에서 TCP 는 연결지향형이라서 연결을 시도한 후에 데이터를 전송했다면, UDP(User Datagram Protocol)은 비연결형 통신 프로토콜이다. 뭐? 연결을 안하고 데이터를 어떻게 보내?
우리 택배 보낼떄 상대방의 주소를 알고 보내지 않는가? 그거랑 똑같다. 그냥 상대방 IP주소 알고 포트번호 알면 그냥 일단 데이터 보내고 보내는 것이다. 그렇기 때문에 데이터 전송의 신뢰성을 보장하지 않는 대신에 빠르고 간단한 방식으로 통신을 제공한다.
빠른 전송속도, 오버헤드 감소, 실시간 전송에 적합하나, 신뢰성이 부족하고 오류 복구 기능이 없고, 혼잡 제어 기능도 없다.
주로 빨라야하는 곳에서 사용한다.
UDP 헤더
Source Port | 16 | 송신 측 포트 번호 |
Destination Port | 16 | 수신 측 포트 번호 |
Length | 16 | UDP 헤더와 데이터 전체 크기 |
Checksum | 16 | 데이터 무결성을 확인 (선택적) |
헤더는 진짜 간단하다. 상대 포트 주소, 우리쪽 포트 주소, 길이 , 체크섬
IPv4 와 IPv6
위의 TCP와 UDP같은 경우에는 결국엔 전송계층 (4계층) 에서 사용되는 프로토콜 들이다.
TCP도 그렇고 UDP도 그렇고 포트번호와는 관련이 있는데, IP와 관련된 내용은 없다. IP와 관련된 내용은 한 단계 하위 계층인 네트워크 계층에서 IP라는 프로토콜을 통해서 작업이 진행된다.
IP주소, IP주소 하는데, 우리에게는 좀 익숙한 단어이지 않은가? 근데 IPv4와 IPv6는 무엇인가?
둘다 IP(Internet Protocol)의 버전이다. 네트워크에서 장치(컴퓨터, 서버, IoT)의 식별과 통신을 담당하는 주소 체계인데, 버전이라고 생각하면 된다. IPv4는 초기 인터넷 환경에서 사용되었고, IPv6는 IPv4의 한계를 극복하기 위해서 개발된 것이다.
IPv4
인터넷 프로토콜의 4번째 버전으로 32비트 주소 체계를 사용하여 약 43억개의 IP주소를 제공한다.
32비트, 8비트씩 쪼개서 4덩이로 묶는데 8비트로 표현할 수 있는 값은 0부터 255까지이기에 네 덩이로
0.0.0.0 ~ 255.255.255.255 까지 표현할 수가 있다.
다만 지금 이게 인터넷 사용량이 폭증하면서 주소 고갈 문제가 발생하였고, 네트워크 내부에서 사용되는 사설 IP로 10.X.X.X, 172.31.X.X, 192.168.X.X 등으로 나눠서 사용하고 있다.
이걸로 A, B, C, D, E클래스로 나눈다.
설계가 단순하고 인터넷 초기에 널리 사용되었기 때문에 IP주소가 고갈되었고, 보안기능이 부족하여 추가 프로토콜이 필요로 하는 상황이다. 다만 현재 대부분의 네트워크 환경에서 지원된다.
IPv6
IPv4를 개량한? 업그레이드한 버전으로, 128비트 주소(16바이트)를 사용하기에 거의 무한대의 주소공간이다. 2001:0db8:85a3:0000:0000:8a2e:0370:7334 이런식으로 사용하는데, 보안성까지 내장되어있고, IPv4에서 필요없는 헤더들 다 지워버리는 식으로 되어있어서 헤더가 간소화 되어 데이터 전송 효율성이 증가하였다.
다만...저런 주소 쓴 거 본 적 있는가? 있긴 있는데 거의 본적이 없다. 기존 네트워크 인프라에서 Ipv6로 전환시 시간과 비용이 소요되기 때문이다.
DNS
DNS(Domain Name System)는 사용자가 쉽게 기억할 수 있는 도메인 이름이다. 아이피 주소 막 13.133.251.241 이런 거 되어있는데, 사람들이 어떻게 쉽게 외우겠는가, 그래서 저 아이피 주소랑 도메인 이름을 연결시키는 게 DNS라고 보면 된다. 일종의 전화번호부 역할이다.
www.google.com 을 컴퓨터가 이해하는 IP주소로 변환해준다 라고 보면 된다. 그렇기에 쉽게 사람들이 접근하게 만든다.
사용자가 도메인 이름만 기억하면 되므로 편리하고, 분산 구조로 인해 확장성과 안정성이 높다. 다만, DNS서버 장애시 연결이 불가능하다...
이정도만 알면 될 것 같다. 막 루트 도메인부터 com, or,g ac.kr 이런 거 굳이 외워야하나 싶다..
아 한국같은 경우 저기 도메인 주소를 관리하는 도메인 서버가 있는데, KT, SKT 전부 각각 다르다.
이게 왜 갑자기 나오냐? DNS같은 경우 빠르게 데이터를 받아와야하기 떄문에 UDP를 이용해서 도메인 서버에서 데이터를 주고 받는다.
포트
포트(Port)란, 컴퓨터 네트워크에서 데이터가 들어오고 나가는 통로라고 보면 된다. 그니까 HTTP요청을 보냈을 때 IP주소를 타고 들어갔을 때 어디 위치에다가 해당 요청을 받아서 처리하냐 그런 항구라고 보면 된다. 특성 서비스나 어플리케이션을 식별하는 역할. 0부터 65535까지 존재하며, 0번부터 1000번까지는 표준적으로 약속되어있는 포트이고, 그 외에 나머지는 우리가 열고싶은 곳에다가 열고 닫고 할 수가 있다.
포트포워딩
포트 포워딩(Port Forwarding)은 외부 네트워크(인터넷)에서 들어오는 데이터를 특정 내부 네트워크 장치로 전달하는 기술이다. NAT(Network Address Translation)환경에서 주로 사용되며, 공유기나 방화벽을 통해 외부 요청을 내부 네트워크의 특정 장치나 서비스로 라우팅한다.
예를 들어보자. 사용자가 인터넷을 통해서 특정 IP주소와 포트번호로 요청을 보냈다고 치자. 203.0.113.1:8080
이때 공유기는 이 쵸엉을 미리 설정된 내부 네트워크 장치의 IP주소와 포트로 전달한다. 그리고 내부 서비스는 응답을 처리하고 공유기를 통해 외부로 반환해준다.
원격접속, 게임서버, 웹 서버 운영등에서 쓰는데,
이걸 쉽게 정리하자면,
너네 공유기는 203.0.122.122라는 IP주소를 가지고 있고, 이 공유기에 연결되어있는 애들은 이제 내부적으로 192.168.X.X로 각각 나눠가졌을 때 외부에서 들어온 요청을 내부 기기로 보내주느 ㄴ역할이라고 보면 된다. 이때 외부에서 80번으로 들어온 걸 내부로 2300번 포트로 넘겨주게 설정을 시켜줄 수 있는 거고, TCP로 올지 UDP로 올지 이런 거 다 설정해줄 수 있는 것이다. 외부 네트워크의 요청을 내부 네트워크 장치로 전달하는 기술. 포트 포워딩은 원격 접속이나 서버 운영에 필수적이지만, 보안을 철저히 관리해야 안전하게 사용할 수 있다.
에필로그
양이 많아.
'KnockOn' 카테고리의 다른 글
[1주차 TIL] KnockOn Bootcamp 쿠키와 세션 (0) | 2024.12.05 |
---|---|
[1주차 TIL] KnockOn Bootcamp HTTP/HTTPS (2) | 2024.12.04 |
[1주차 TIL] KnockOn Bootcamp 웹이란? (4) | 2024.12.02 |
[KnockOn] Linux/Ubuntu C언어 구조체 - 1 (0) | 2024.11.25 |
[KnockOn] Linux/Ubuntu C언어 <string.h> (0) | 2024.11.24 |