복잡한 인터넷 세상에서 어디론가 메시지를 보내기 위해서는 최소한의 규칙이 필요하다. 쉽게 말해서 그 규칙이 ip다.
그럼 ip가 하는 역할을 좀 알아보자
- 지정한 ip 주소에 데이터 전달
- 패킷(packet)이라는 통신 단위로 데이터 전달
쉽게 말해서 특정 주소 A에서 특정 주소 B로 데이터를 전달하는데 이를 패킷이라는 단위로 데이터를 쪼게서 전달한다는 뜻이다. 하지만 이러한 IP도 한계가 있다.
ip의 한계
- 비연결성 : 받는 상대가 받을 수 있는지 확인 안함, 걍 보냄
- 비신뢰성 : 데이터가 잘 전달 됬는지 신경 안씀, 보낸 순서도 상관 안하고 그냥 먼저 도착하는 데이터 순으로 받게 됨
- 프로그램 구분 : 어떤 데이터가 어떤 프로그램의 데이터인지 구분하지 못함
그냥 상식적으로 생각해보자 편지를 보내면 상대방이 편지를 잘 받았는지 물리적으로 알 수 있는가? 없다! 옜날에는 데이터의 전송도 편지 배달과 같은 방식이였을 것이다.
그래서 위와 같은 한계를 극복하기 위해 TCP라는 방식이 생긴 것이다!
TCP/UDP
- TCP 은 두 개의 호스트를 연결하고 데이터 스트림을 교환하게 해주는 중요한 네트워크 프로토콜이다. TCP는 데이터와 패킷이 보내진 순서대로 전달하는 것을 보장해준다
- UCP도 다른 컴퓨터와 데이터 통신을 하기 위한 네트워크 프로토콜의 일종이다.TCP와는 다르게 패킷의 순서, 수신여부를 보장하지 않는다.
그렇다면 이 TCP와 UDP가 네트워크에서 어디에 어떻게 적용되는가를 알아보자, 일단 우리는 네트워크의 계층구조에 대해 알고 있어야 한다.
일단 둘다 같은 네트워크에 대한 계층적 설명이다. 다만 바라보는 시점에 따라 계층의 이름과 세분화가 다르게 되어 있는 것이다.
OSI 7 Layer 개요
- 네트워크 통신을 체계적으로 다루고 있는 ISO 표준은 개방시스템 상호연결 (OSI) 모델 이다. OSI 모델은 1984년에 정의 되었다.
- 개방시스템(Open System)이란 기반구조와 관계없이 시스템간의 통신을 제공하는 프로토 콜의 집합이다.
- 계층구조를 가짐으로써 데이터자체의 흐름을 각 구간별로 데이터의 움직임을 알 수 있다. 또한 트러블슈팅 자체가 용이해지며 각기 다른 벤더사 와의 호환성도 해결될 수 있다.
TCP/IP Protocol Suite 개요
- TCP/IP는 현재의 인터넷에서 컴퓨터들이 서로 정보를 주고받는데 쓰이는 통신규약 (프로토콜)의 모음이다.
- 1960년대 말 미국방성의 연구에서 시작되어 1980년대 초 프로토콜 모델이 공개 되었다.
- 하드웨어, 운영체제, 접속매체에 관계없이 동작할 수 있는 개방성을 가진다.
뭐 사전적인 정의는 위와 같다. 오늘 알아볼 TCP/UDP는 두 계층적 설명에서 transport layer (전송 계층)에서 일어나는 일이다. 그리고 이번 글에서는 TCP/IP Protocol Suite을 중심으로 작성한다.
간단하게 위 계층 간 데이터 송수신 과정을 살펴 보면 다음 그림과 같다.
위 그림 처럼 데이터를 전송하면 아래 그림 처럼 각 계층을 통과하며 "캡슐화" 가 진행된다. 캡슐화를 해서 링크 계층을 통해 전달하면 받는 쪽에서는 "비캡슐화" 가 진행되며 데이터를 획득 한다.
TCP/UDP는 어디? "전송 계층" 에서 캡슐화를 담당해 정보를 처리한다. 받는 쪽에서 비캡슐화를 진행하하다 tcp헤더를 만나면 그에 맞는 로직을 작동한다고 이해하면 좋을듯 하다.
먼길 돌아왔다...
TCP는 상대방의 연결 상태를 확인하고 데이터를 전송함으로 데이터의 순서를 보장한다! 이걸 어떻게 구현되어 있느냐
일단 데이터 전송 전에 서로 연결이 가능한지 확인을 한다. 이를 3way handshake 라고 한다
예를 들어 하나의 전송 데이터를 5개의 패킷으로 쪼겠고 이걸 순차적으로 SERVER로 전달한다고 해보자.
먼저 연결을 확인한다 (#1, #2). 그럼 #3에 패킷1을 같이 전달한다. 그럼 서버에서 패킷1을 수신했으면 다시 ACK으로 받아야할 다음 패킷2를 보내달라고 요청한다. 이걸 패킷5까지 반복한다.
아니 그럼 이 TCP 통신이 어디에 나와 있는데!
헤더에 나와 있습니다. 고갱님~
헤더를 한번 까보자
구조상 이렇게 생겼다. 이 tcp 헤더가 전체 ip 헤더의 protocol에 들어간다. 전체 헤더는..
대충 감이 오는가? 그럼 tcp 헤더의 각 부분에 대해 한번 알아보자.
세그먼트의 출발지와 목적지를 나타내는 필드다. IP주소와 port 번호가 필요하겠지만 ip주소는 ip헤더에 담겨있기 때문에 TCP 헤더에는 ip주소 필드는 없고 포트만 넣는다.
데이터의 순서를 뜻한다. 순서 번호는 최대 4,294,967,296까지 설정할 수 있어서 쉽게 중복되지 않는다. 이걸 보고 데이터를 받는 쪽에서 세그먼트를 순서대로 다시 조립할 수 있는 것이다.
일종의 승인 번호다. 데이터를 받은 쪽에서 "다음은 이 데이터를 줘"라고 보내는 번호이다. 연결 설정과 연결 해제 때 발생하는 핸드쉐이크 과정에서는 상대방이 보낸 시퀀스 번호 + 1로 자신의 승인 번호를 만들어내지만, 실제로 데이터를 주고 받을 때는 상대방이 보낸 시퀀스 번호 + 자신이 받은 데이터의 bytes로 승인 번호를 만들어낸다.
보내진 세그먼트에서 어디서 부터가 payload의 시작인지를 뜻한다.
미래를 위해 예약된 필드로, 모두 0으로 채워져야 한다. 상단의 헤더 그림에도 그냥 0 0 0으로 찍혀있는 것을 확인해볼 수 있다.
한번에 전송할 수 있는 데이터의 양을 뜻한다.
데이터를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값이다.
긴급 포인터를 뜻한다. 만약 이 플래그가 1이라면 수신하는 쪽에서는 이 포인터가 가르키는 데이터를 우선 처리한다.
옵션 필드는 TCP의 기능을 확장할 때 사용하는 필드들이며, 이 필드는 크기가 고정된 것이 아니라 가변적이다. 그래서 수신 측이 어디까지가 헤더고 어디서부터 데이터인지 알기 위해 위에서 설명한 데이터 오프셋 필드를 사용한다.
솔직히 요즘에는 90% 이상의 IP 통신이 TCP를 사용한다. 그럼 UDP는 구리냐? 안쓰냐? 그건 아니다...
TCP와의 차이점 위주로 보자