우노
[Network] TCP/IP 와 TCP/IP 4계층이란? 본문
패킷 통신이란?
- 데이터를 패킷이라고하는 작은 단위로 나누어 전송하는 방식을 의미합니다.
IP (Internet Protocol) 란?
- IP는, 패킷 데이터들을 최대한 빨리 특정 목적지 주소로 보내는 프로토콜입니다.
- 빨리 보내는게 목적이기 때문에,
- 패킷 전달 여부를 보증하지 않으며, 패킷을 보낸 순서와 받는 순서가 다를 수 있습니다.
TCP (Transmission Control Protocol) 란?
- 패킷 통신은, 데이터를 작은 단위로 나누어 전송하기 때문에, 순서가 뒤섞이거나 내용이 유실될 수 있다는 단점이 있습니다.
- 따라서, 이러한 문제를 해결하기 위해 TCP 라는 프로토콜이 존재합니다.
- TCP는, 패킷을 정상적으로 받을 수 있도록 하는 프로토콜입니다.
- 꼼꼼하게 보내는게 목적이기 때문에, IP 보다 패킷 전송 속도는 느리지만,
- 패킷 전달 여부를 보증하고, 패킷을 송신 순서대로 받게 해줍니다.
- 즉, 목적지에 도착한 패킷들을 순서대로 정렬하고, 손상되거나 손실된 패킷이 있다면, 출발지에 재요청하는 방식으로 진행됩니다.
TCP/IP 란?
- TCP/IP는 IP(인터넷 프로토콜)와 TCP(전송 조절 프로토콜)의 묶음을 의미합니다.
- 즉, 두 가지 프로토콜 방식을 조합하여 인터넷 통신하는 것을 TCP/IP 라고 부르는 것입니다.
- 송신자가 수신자에게 IP 를 사용하여 최대한 빠르게 패킷을 전송하면
- TCP 를 활용해 패킷을 정상적으로 수신 받습니다.
- 이렇게 복수의 프로토콜 집합을 프로토콜 스택(Protocol Stack), 혹은 프로토콜 스위트(Protocol Suite)라고 부르며, 서로 다른 프로토콜 스택끼리는 통신 할 수 없습니다.
OSI 7계층과 TCP/IP 4계층 간단 비교
- OSI 7계층은, 컴퓨터와 간 패킷 통신을 위해 거쳐야하는 7개의 계층을 의미합니다.
- TCP/IP 4계층은, TCP/IP 프로토콜 통신 과정에 초점을 맞추어, OSI 7계층을 좀 더 단순화 시킨 계층을 의미합니다.
- 이러한 계층적인 구조는 아래와 같은 특징을 가지고 있습니다.
- 각 계층별 처리 역할이 다르기 때문에, 계층별 간섭을 최소화할 수 있습니다.
- 특정 계층에서 문제가 생기면, 해당 계층을 살펴보면 되기 때문에, 유지 보수가 편리합니다.
- 다른 계층끼리는 데이터의 전달 과정을 구체적으로 알 필요가 없기 때문에, 데이터의 캡슐화와 은닉이 가능합니다.
TCP/IP 4계층의 캡슐화, 역캡슐화
TCP/IP 4계층은, 위 그림과 같이 애플리케이션 계층, 전송 계층, 인터넷 계층, 네트워크 접근 계층으로 이루어져있습니다.
데이터 전송 시, 데이터는 상위 계층에서 하위 계층으로 이동하고, 계층 이동 마다 필요한 정보(헤더)가 추가됩니다.
- 이를, 캡슐화라고 합니다.
데이터 수신 시, 데이터는 하위 계층에서 상위 계층으로 이동하고, 계층 이동 마다 추가된 헤더를 읽고 알맞은 행동을 취한 후, 헤더를 제거합니다.
- 이를, 역캡슐화라고 합니다.
계층 별로 추가되는 헤더는 아래와 같습니다.
4계층 : 애플리케이션 계층(Application Layer)
- 사용자와 가장 가까운 계층으로, 사용자-소프트웨어 간 소통을 담당하는 계층입니다.
- 애플리케이션을 실행하기 위한 데이터 형식이 작성됩니다.
- 프로토콜로는 HTTP, HTTPS, FTP, SSH, Telnet, DNS, SMTP 가 있습니다.
3계층 : 전송 계층(Transport Layer)
- 통신 노드 간 신뢰성 있는 데이터 전송을 보장하는 계층입니다.
- 역캡슐화 과정에서, 포트 번호를 사용해 데이터를 정확한 애플리케이션에 전달하는 역할도 합니다.
- 네트워크 액세스 계층과 인터넷 계층을 통해, 데이터가 목적지 기기까지 정상적으로 도착했다면,
- 전송 계층은 포트 번호를 사용해, 데이터를 목적지 기기 내 적절한 에플리케이션으로 전달합니다.
- 프로토콜로는 TCP, UDP, RTP, RTCP 가 있습니다.
2계층 : 인터넷 계층(Internet Layer)
- 패킷을 최종 목적지까지 라우팅하는 계층입니다.
- 프로토콜로는 IP, ARP, ICMP, RARP, OSPF 가 사용됩니다.
1계층 : 네트워크 액세스 계층(Network Access Layer or Network Interface Layer)
- 데이터를 전기신호로 변환한 뒤, 물리적 주소인 MAC 주소를 사용해, 알맞은 기기로 데이터를 전달하는 계층입니다.
- 프로토콜로는 Ethernet, Wi-Fi, PPP, Token Ring 과 같은 프로토콜이 사용됩니다.
정리
예제를 통한 TCP/IP 흐름 이해
만약, www.google.com 을 웹 브라우저에 입력하면 무슨 일이 일어날까요?
- 구글 웹서버에 80번 포트로 HTTP Request 를 보낸다는 의미와 동일합니다.
우선, 구글 웹 서버에 HTTP Request 를 보내기 위해선, 아래와 같이 각 계층에 필요한 정보들을 담은 패킷을 만들어야합니다.
- 해당 예제에선, 각 계층 별로 HTTP, TCP, IP, Ethernet 프로토콜을 사용한다고 가정해보겠습니다.
따라서, Application, Transport, Internet, Network Access Layer 순으로 어떤 데이터가 들어가는지 순서대로 살펴보겠습니다.
먼저, 패킷의 Application Layer 에는 HTTP Request 헤더가 들어갑니다.
:authority: www.google.com :method: GET :path: / :scheme: https ... ...
이후,Transport Layer 에는 TCP 헤더가 들어갑니다.
- TCP 헤더에서 중요하게 볼 것은 SP(출발지 포트번호)와 DP(목적지 포트번호)입니다.
- 출발지 포트번호는 내 컴퓨터에서 만든 소켓의 포트 번호이므로, 내 컴퓨터는 알고 있으며, 목적지 포트 번호 또한 80으로 알고 있습니다.
이후, Internet Layer 에는 IP 헤더가 들어갑니다.
- IP 헤더에서 중요하게 볼 것은 SA(출발지 IP주소) 와 DA(목적지 IP주소)입니다.
- 현재, www.google.com 이라는 도메인 정보만 알고 있기 때문에
- 나의 시작 IP 주소는 알고 있지만, 목적지의 IP 주소는 아직 모릅니다.
- 따라서, 도메인 정보로 목적지의 IP 주소를 알아내기 위해,
- 도메인 서버에 DNS 쿼리를 보내고, IP 주소를 응답받습니다.
이후, Network Access Layer 에는 Ethernet 헤더가 들어갑니다.
- Ethernet 헤더에서 중요하게 볼 것은 SA(출발지 MAC 주소)와 DA(목적지 MAC 주소)입니다.
- 여기서 목적지 MAC 주소는, 구글의 MAC 주소가 아닌,
- 물리적으로 연결된, 패킷이 전달될 라우터(예를 들어, 공유기) 또는 게이트웨이의 MAC 주소를 의미합니다.
- 따라서, 라우터의 MAC 주소를 알아내기 위해, ARP 프로토콜을 사용합니다.
- ARP 프로토콜에 대한 개념은 아래 링크를 통해 배우실 수 있습니다.
- https://wooono.tistory.com/110
- 이제, ARP 프로토콜을 통해 라우터의 MAC 주소까지 알아냈습니다.
이후 패킷을 전송하기 전, TCP는 연결지향형 프로토콜이기 때문에, 송신측과 수신측이 서로 연결되는 작업이 필요합니다.
이러한 작업을 3 Way Handshaking 이라고 부릅니다.
3 Way Handshaking 을 수행하기 위해서는, TCP 헤더에 표시한 플래그들이 사용되며, 이러한 플래그들을 컨트롤 비트라고 부릅니다.
3 Way Handshaking 은 SYN(동기화) 과 ACK(승인) 로 진행됩니다.
먼저, 클라이언트는 서버에게, 접속을 요청하는 SYN 패킷을 보냅니다.
서버는 SYN 패킷을 받고, 클라이언트에게 요청을 수락한다는 ACK 와 SYN 플래그가 설정된 패킷을 보냅니다.
클라이언트는 다시 서버에게 ACK 패킷을 보냅니다.
이제 3 Way Handshaking 으로 기기 간 연결이 성립되었으니, 데이터 통신이 가능해집니다.
이제 라우팅을 통해 패킷을 목적지 서버에게 전송합니다.
패킷은 Network Access Layer의 MAC 주소와 Internet Layer의 IP 주소로 라우팅을 반복해 목적지 구글 서버까지 도착합니다.
따라서, Transport Layer부터 설명을 진행하겠습니다.
먼저, 구글 서버가 받은 패킷 내부 Transport Layer의 목적지 포트 번호에는 80번이 적혀져있습니다.
따라서, Transport Layer는 80번 포트를 사용하고 있는 Application Layer에 데이터를 전송합니다.
이후, Application Layer는 HTTP Request 데이터를 받아, “/” 에 매핑된 GET 요청을 처리합니다.
이후, 적절한 HTML을 클라이언트에게 응답합니다.
따라서, 클라이언트는 라우팅을 통해 전달 받은, “www.google.com” 에 해당하는 HTML 을 브라우저에 띄우게 됩니다.
이제 HTTP 요청 및 응답 과정이 끝났으므로, 연결을 종료해야합니다.
여기서도 TCP의 컨트롤 비트가 사용되며, 해당 단계에서는 ACK, FIN 플래그가 사용됩니다.
클라이언트와 서버의 연결 종료 작업을 4 Way Handshaking 이라고 부르며, 총 4단계로 진행됩니다.
먼저, 클라이언트는 서버에게, 연결을 종료하겠다는 의미인 FIN 패킷을 전송합니다.
서버는 클라이언트에게 ACK 패킷을 보내고, 클라이언트가 보냈던 요청들에 대해 마저 응답을 보냅니다.
이후, 서버의 응답이 끝나면 클라이언트에게 FIN 패킷을 전송합니다.
클라이언트는 서버의 통신 종료를 확인한 뒤, 서버에게 ACK 패킷을 전송하고, 연결이 종료됩니다.
하지만, 서버가 클라이언트에게 FIN 을 보내는 과정에서 한가지 문제가 발생할 수 있습니다.
서버가 클라이언트에게 FIN 을 보내기 전에, 이전에 서버가 클라이언트에게 응답 했던 패킷이 FIN 보다 늦게 도착할 수도 있습니다.
그렇게 되면, 클라이언트가 서버의 일부 응답을 받지 못하게 됩니다.
따라서, 클라이언트는 서버로부터 FIN 패킷을 받고, ACK 패킷을 보낸 뒤에도
일정 시간동안 혹시나 아직 도착하지 않은 잉여 패킷을 기다립니다.
이렇게, 4 Way handshaking 이후에도 소켓을 닫지 않고 잉여패킷을 기다리는 상태를, TIME_WAIT 이라고 합니다.
흐름 요약
- www.google.com 을 브라우저 주소창에 입력합니다.
- 보낼 패킷의 HTTP 헤더는, HTTP Request 를 통해 채워진 상태입니다.
- 보낼 패킷의 IP 헤더를 채우기 위해, DNS 서버를 통해 www.google.com 도메인의 IP 주소를 응답 받습니다.
- 보낼 패킷의 TCP 헤더를 채우기 위해, 클라이언트와 구글 웹서버 간 TCP 연결을 합니다.
- 3-Way Handshaking
- 보낼 패킷이 완성되었으므로, www.google.com 에 패킷을 전송하고, HTML 을 응답받습니다.
- 클라이언트는 응답 받은 HTML 을 브라우저에 띄웁니다.
- 클라이언트와 구글 웹서버간 TCP 연결을 종료합니다.
- 4-Way Handshaking
참고
- https://brunch.co.kr/@wangho/6#comment
- https://nordvpn.com/ko/blog/tcp-ip-protocol/
- https://velog.io/@rosewwross/TCPIP
- https://coding-factory.tistory.com/613
- https://data-study-clip.tistory.com/110
- https://hahahoho5915.tistory.com/15
- https://hwannny.tistory.com/117
- https://m.blog.naver.com/soojin_2604/221950485931
- https://www.youtube.com/watch?v=BEK354TRgZ8
- https://www.wisewiredbooks.com/csbooks/ch3-network-internet/tcp-ip-intro.html
- https://junu0516.github.io/posts/tcp_ip_4계층/
- https://devlopsquare.tistory.com/233
'Network & Security > Concept' 카테고리의 다른 글
[Network] TCP 의 3-Way Handshaking, 4-Way Handshaking 이란? (0) | 2022.06.10 |
---|---|
[Network] www.google.com 접속 흐름 (0) | 2022.06.10 |
[Network] 패리티 비트와 해밍 코드 (0) | 2021.12.14 |
[보안] SSL(Secure Socket Layer) 프로토콜이란? (0) | 2020.09.16 |
[보안] 패킷 전송 개념 및 방법 (1) | 2020.09.11 |