TCP/IP (1) - 컴퓨터 네트워크 / 애플리케이션 계층 / 트랜스포트 계층

25659 단어 CSTCP/IP네트워크CS

해당 포스트는 리브로웍스, 『(명쾌한 설명과 풍부한 그림으로 배우는) TCP/IP: 쉽게, 더 쉽게』, 제이펍(2016)을 참고하여 작성하였습니다.



컴퓨터 네트워크


현 세대에 와서 컴퓨터 네트워크는 인간과 뗄래야 뗄 수 없는 존재가 되었어요. 사람들은 항상 스마트폰을 가지고 다니고, 이제는 스마트 TV에 냉장고까지 컴퓨터 네트워크를 사용하지 않는 기기가 없다고 해도 과언이 아니죠.

이러한 컴퓨터 네트워크인터넷 과 연관이 깊어요. 때문에, 컴퓨터 네트워크를 아는 것은 곧 인터넷에서 사용되는 TCP/IP 기술을 아는 것과 같다고 말할 수 있죠.

과거에는 네트워크 기술들이 다양하게 독립적으로 존재했다고 하지만, 오늘날에 와서는 TCP/IP를 중심으로 통하되고 표준화되었어요. 덕분에 우리는 가정에서든 기업에서든 쉽게 로컬 컴퓨터 네트워크를 인터넷에 연결할 수 있게 된거죠. 이는 네트워크 관련 기술이 새롭게 개발될지라도 TCP/IP를 중심으로 통합하면 되기에 신기술 도입이 괴장히 빨라져요.

컴퓨터 네트워크는 크게 4가지 계층으로 분류됩니다. 이는 가각 애플리케이션 계층 , 트랜스포트 계층 , 인터넷 계층 , 네트워크 인터페이스 계층 인데요. 이 계층들은 위아래로 인접한 계층끼리 서로 정보를 주고 받으면서 네트워크 통신을 해요.

그럼 이제부터 이 컴퓨터 네트워크에 대해 더 자세히 알아보도록 합시다!


컴퓨터 네트워크의 종류

컴퓨터 네트워크여러 대의 컴퓨터를 연결하여 서로 데이터를 주고 받을 수 있도록 구축된 망을 얘기해요. 이렇게 연결된 컴퓨터들은 그 수가 많으면 많을수록, 네트워크의 규모 또한 커지고, 그 만큼 더 다양한 정보 교환과 통신 방식을 경험하게 돼요. 이러한 컴퓨터 네트워크는 간단한 커뮤니케이션부터 파일이나 주변 기기의 공유까지 다양한 목적으로 폭 넓게 활용되고 있어요.

LAN : 실내에서 비교적 근거리에 위치한 컴퓨터들이 연결된 것을 LAN (Local Area Network) 이라고 한다. (ex. 가정, 사무실)
WAN : 비교적 먼 거리에 위치한 컴퓨터들과 연결된 것을 WAN (Wide Area Network) 이라고 한다. (ex. 바깥)

이러한 네트워크들 중에서도 규모가 가장 큰 것이 바로 인터넷 이에요. 인터넷이 개발된 이후로 우리가 어디에 있던지 네트워크가 인터넷에만 연결된다면, 다른 네트워크일지라도 다른 누구와도 자유롭게 데이터를 주고받을 수 있어요.


서버와 클라이언트

서버클라이언트 의 역할은 하드웨어가 아닌 어떤 역할의 프로그램을 설치하느냐에 따라 결정돼요.

서버 (Server) : 네트워크에 연결된 컴퓨터 중 서비스를 제공하는 컴퓨터
클라이언트 (Client) : 네트워크에 연결된 컴퓨터 중 서비스를 받는 컴퓨터

피어 투 피어 (P2P, Peer-tp-Peer) 는 네트워크에 연결된 두 컴퓨터가 서버와 클라이언트의 역할을 동시에 할 수 있어, 서로 서비스를 주거나 받을 수 있는 통신 방식을 뜻해요. 주로 개인 컴퓨터 간 파일 공유나 인터넷 전화 (VoIP, Voice over IP)에 이용되죠.


패킷 교환 방식

패킷 (Packet) : 컴퓨터 네트워크에서 이메일이나 파일과 같은 데이터를 전달할 때, 데이터를 작게 분할하는 단위. 패킷은 어디로 전달되어야 하는지 구별되도록 어드레스(Address) 정보를 담고 있다.

회선 교환 방식 : 통신하려는 양측을 연결하기 위해 하나의 통신 경로를 점유한 후 통신하는 방식. 기본적으로 1 대 1 통신만 할 수 있다. (아날로그 유선 전화, 3G 휴대전화)
패킷 교환 방식 : 주고받을 데이터를 작게 쪼개어 다른 데이터의 조각들과 통신 경로를 공유하며 전송하는 방식. 여러 상대와 통신할 때 효과적이다.


컴퓨터 네크워크와 계층 모델

컴퓨터 네트워크에서는 통신에 참여하는 여러 장비나 프로그램들이 맡은 각각의 역할들이 있는데, 이 역할들을 이해하기 쉽게 분류하고 추상화한 것을 계층 모델 이라고 해요.

애플리케이션 계층 : 웹 서비스와, 이메일과 같은 서비스를 사용자에게 제공 (HTTP, SMPT, POP3, FTP, SSH)
트랜스포트 계층 : 애플리케이션 계층과 인터넷 계층 사이에서 데이터가 올바르게 전달되도록 중계 (TCP, UDP)
인터넷 계층 : 목적지의 IP Address로 데이터를 전달 (IPv4, IPv6, ICMP)
네트워크 인터페이스 계층 : 네트워크 어댑터와 같은 하드웨어를 통해 데이터를 전달 (이더넷 무선 LAN, MAC 어드레스, PPP, FTTx, xDSL)

통신 과정에서 각 계층을 지나는 데이터는 패킷 단위로 작게 쪼개지고 목적지 정보와 같은 부가 정보가 헤더 의 형태로 덧붙여지게 돼요.

헤더 (Header) : 데이터 앞에 덧붙이는 정보
트레일러 (Trailer) : 데이터 뒤에 덧붙이는 정보

각 계층의 헤더가 간직한 정보는 다음과 같아요.

애플리케이션 계층 : 패킷의 실제 몸통에 해당하는 데이터 (작게 분할된 데이터)
트랜스포트 계층 : 데이터의 결합 순서와 이 데이터를 받을 프로그램을 식별할 수 있는 번호
인터넷 계층 : 목적지의 컴퓨터를 식벽할 수 있는 번호
네트워크 인터페이스 계층 : 유선 LAN에서 데이터를 보내는 데 필요한 정보


4개 계층의 동작 방식

애플리케이션 계층 : 사용자가 실제로 체감할 수 있는 서비스를 제공한다.
트랜스포트 계층 : 애플리케이션 계층의 프로그램에서 전달받은 데이터를 목적지 애플리케이션 계층의 프로그램까지 전달. 데이터가 제대로 전달되지 않아 재전송해야 할 때도 이 계층에서 처리한다.
인터넷 계층 : 데이터에 어드레스 정보를 덧붙여 목적지까지 전달. 이 떄, 목적지까지 도달할 수 있는 경로를 찾기위해 라우터(Router)라는 장비가 사용된다.
네트워크 인터페이스 계층 : 유선 LAN 어댑터나 무선 LAN 어댑터가 처리할 수 있는 형태로 데이터를 변환화고 이 데이터를 목적지까지 전달한다.


통신 규약과 프로토콜

컴퓨터 네트워크를 이해하기 위해서는 프로토콜(Protocol) 이라는 핵심 개념을 잘 알고 있어야 한답니다. 컴퓨터와 컴퓨터가 통신할 때, 커뮤니케이션을 더욱 원활하고 효과적으로 이루기 위해 지켜야할 절차나 규악을 프로토콜 이라고 해요.

프로토콜 자체는 프로그램처럼 통신 기능을 구현한다거나 통신 장비와 같이 물리적 형태가 있는 것이 아닌, 통신 과정의 절차나 규칙이 기술된 사양서에요. 네트워크 프로토콜들은 각 계층마다 그 역할이 전문화되고 세분화 되어있어요. 그렇기에 하나의 통신을 전체적으로 성공시키기 위해서는 각 계층들의 프로토콜들을 잘 조합해서 사용해야 돼요.

웹 페이지
애플리케이션 계층 : HTTP (웹 페이지를 보기 위한 프로토콜)
트랜스포트 계층 : TCP (데이터를 확실하게 전달하기 위한 프로토콜)
인터넷 계층 : IP (일반적인 통신에 사용하는 프로토콜)
네트워크 인터페이스 계층 : 이더넷 (유선 LAN으로 데이터를 전송하기 위한 규격)

인터넷 전화
애플리케이션 계층 : VoIP 프로토콜 (전화 애플리케이션을 위한 프로토콜)
트랜스포트 계층 : UDP (확실한 데이터 전달은 보장하기 어렵지만 고속 전송이 가능한 프로토콜)
인터넷 계층 : IP (일반적인 통신에 사용하는 프로토콜)
네트워크 인터페이스 계층 : IEEE802.11 (무선 LAN으로 데이터를 전송하기 위한 규격)

각 계층별로 대표적인 프로토콜들은 다음과 같아요.

애플리케이션 계층
HTTP : 웹 페이지 데이터를 주고 받음
HTTPS : 보안을 위해 웹 페이지 데이터를 주고 받는 과정을 암호화함
POP3 : 서버에 보관된 수신 메일을 꺼내옴
SMTP : 메일을 송신함
FTP : 파일을 전송함
Telnet : 컴퓨터를 원격에서 제어함
SSH : 보안을 위해 컴퓨터를 원격에서 제어하는 과정을 암호화함
SMB : 윈도우 컴퓨터와 파일을 공유함
DHCP : 컴퓨터에게 프라이빗 IP를 동적으로 할당함
DNS : 도메인 이름과 IP 어드레스를 서로 변환함
SSL : 보안을 위해 통신 과정에서 주고 받는 데이터를 암호화함

트랜스포트 계층
TCP : 애플리케이션의 데이터를 송수신하되 데이터의 정확한 전달을 중시함
UDP : 애플리케이션의 데이터를 송수신하되 데이터의 전송 속도를 중시함

인터넷 계층
IP : 패킷을 목적지까지 전달함
ICMP : IP의 통신 오류를 전달함
IPsec : 패킷을 암호화하여 전달함
ARP : 네트워크 장비의 MAC 어드레스를 알아냄

네트워크 인터페이스 계층
이더넷 : 일반 금속 케이블이나 광 케이블을 통해 데이터를 전달함
PPP : 사용자 인증 후에 원격지의 장비와 통신함

여기서 주목할 점은 TCP/IP 는 하나의 프로토콜을 지칭하는 말이 아니라 인터넷에서 사용되는 각종 표준 프로토콜을 한데 모아 일컫는 말이에요. 그런데 흔히들 TCP/IP라고 부르는 이뉴는 TCP와 IP가 이들 프로토콜 중 가장 대표적인 프로토콜이기 때문이에요.



네트워크 서비스와 애플리케이션 계층


애플리케이션 계층 의 프로토콜들은 사실 컴퓨터 과학에 대해 깊게 배우지 않아도 아마 한번쯤 들어보고 다뤄봤던 것들일 거에요. 바로 HTTPFTP 와 같이 사용자가 실제로 사용하며 체감할 수 있는 서비스들이 그런 것들이거든요.

바로 이러한 애플리케이션 계층의 프로토콜이 하는 일은 사용자에게 특정 서비스를 제공하기 위해 서버와 클라이언트 사이에서 다양한 메시지나 명령을 주고 받는 것이에요. 이는 사용자에게 직접 노출되는 부분이기 때문에 더욱 더 우리에게 익숙하죠.

웹, 이메일, FTP, VoIP(인터넷 전화)와 같은 서비스들은 그 역사가 오래된 애프리케이션인 만큼, 자신들만의 독자적인 프로토콜을 자체적으로 정의하고 있는 것이 보통이에요. 그렇기에 이들 서비스를 사용하기 위해서는 전용 클라이언트와 서버 프로그램이 필요한데요. 그 중에서도 웹을 다루는 프로토콜인 HTTP 이 최근 수년간 가장 많은 이용과 관심을 받는 프로토콜이에요. 이유는 근래 들어 급성장하고 있는 SNS와 같은 서비스들이 별도의 프로토콜을 만들지 않은 채 HTTP 프로토콜을 활용하기 때문이죠. 이러한 것들은 웹 서비스 라고 한답니다.

이렇게 오랜기간 개발되고 보급되어온 프로토콜을 활용한다는 것은 보다 짧은 시간과 적은 노력으로 서비스를 개발하고 개선하는 것이 가능하다는 것이죠.


애플리케이션 계층의 역할

데이터 전송을 담담하고 있는 트랜스포트 이하의 계층들과 달리, 유일하게 사용자가 직접 사용하면서 체감할 수 있는 서비스를 제공하는 계층이 바로 애플리케이션 계층 이에요.

사용자가 직접 사용하는 프로토콜
HTTP : 웹 클라이언트와 웹 서버 사이에서 웹 페이지 데이터를 주고 받는다
POP , SMTP , IMAP : 메일을 송수신하고 보관한다
SMB , AFP : LAN 안에서 파일을 공유한다
FTP : 서버를 통해 파일을 주고 받는다
Telnet , SSH : 원격에서 서버를 제어한다

OS나 다른 애플리케이션 계층의 프로토콜들이 간접적으로 사용해서 사용자가 직접 체감하기 힘든 프로토콜들도 있어요. 주로 인터넷이나 LAN의 원활한 사용을 위해 사용자에게 보이지 않는 이면에서 동작하죠.

사용자가 간접적으로 사용하는 프로토콜
DNS : 도메인명과 IP 어드레스의 정보를 서로 변환할 때 사용한다
DHCP : LAN 내의 컴퓨터에게 IP 어드레스를 할당할 때 사용한다
SSL/TLS : 통신 데이터를 암호화하여 주요 정보를 안전하게 주고 받을 때 사용한다
NTP : 네트워크에 연결된 장비들의 시스템 시간을 동기화할 때 사용한다
LDAP : 네트워크에 연결된 자원(사용자, 장비들)의 통합 관리에 필요한 디렉터리 서비스를 제공할 때 사용한다


웹 페이지를 전송하는 HTTP

웹 브라우저웹 서버 로 특정 웹 페이지를 요청하면 웹 서버가 해당 페이지의 내용을 HTML 형식으로 응답해요. 그러면 웹 브라우저가 서버로부터 받은 데이터를 해석하여 화면을 그린 후 사용자에게 보여주죠. 이 때, HTML 데이터를 해석하다가 CSS나 JPEG와 같은 추가 데이터가 필요하면 해당 파일들을 받기 위해 새로운 요청을 보내요. 그럼 다시 한 번, 웹 서버가 해당 데이터를 응답하고, 웹 페이지가 제대로 그러진답니다. 자세한 과정은 다음과 같아요.

  1. 보고 싶은 웹 페이지의 URL을 요청한다.
  2. 웹 페이지의 HTML 파일을 응답한다.
  3. HTML 내용을 확인한 결과, 추가로 CSS나 JPEG가 필요하면 해당 파일들을 받기 위해 새로운 요청을 보낸다.
  4. 응답으로 받은 HTML, CSS, JPEG, JS 파일들을 조합해서 웹 페이지를 표시한다.

HTTP 통신은 정보를 한 번씩 주고 받은 후에 바로 끊는 형태로 처리돼요. 이렇게 상태 정보를 저장하지 않는 통신 형태스테이트리스(Stateless) 라고 한답니다. HTTP는 대표적인 무상태 프로토콜이에요.

브라우저와 서버가 통신 과정에서 주고 받는 정보들은 HTTP 메시지라고 불러요. 그리고 HTTP 메시지는 크게 요청(Request)응답(Response)의 두 가지 형태로 구분되죠.

요청 정보 행 (응답 정보 행) : 메시지의 종류나 상태를 표시한다.
헤더 : 메시지에 대한 상세한 정보가 포함되어 있다.
메시지 바디 : 응답인 경우 이 부분에 HTML 데이터가 들어간다.

HTTP 응답 데이터의 첫 번째 행인 응답 정보 행에는 요청에 대한 응답 상태를 표시하기 위한 상태 코드 가 들어가요.

100 Continue : 서버가 헤더는 받았고 바디가 올 것을 기다리고 있음
101 Switching Protocols : 클라이언트가 서버에게 프로토콜을 바꾸자고 제안했고 서버도 수락함
200 OK : 요청이 성공했고 요청한 결과 데이터를 응답으로 보냈음
201 Created : 요청이 성공했고 새로 만들어진 URL을 응답으로 보냈음. 웹 서비스나 웹 애플리케이션에서 사용됨
301 Moved Permanently : 요청한 내용이 다른 경로로 옮겨졌음. 이후 옮겨진 경로로 요청해야 함
302 Found : 요청한 내용이 다른 다른 경로로 옮겨졌음. 임시로 옮겨진 것이라 이후에도 동일한 경로로 요청해야 함
304 Not Modified : 요청한 내용은 갱신되지 않았음
400 Bad Request : 요청에 문제가 있음
403 Forbidden : 요청한 내용은 접근 금지됨
404 Not Found : 요청한 내용을 찾을 수 없음


웹 서비스와 웹 애플리케이션

웹 서비스HTTP 메시지로 정보를 교환해요. 다만 웹 브라우저가 웹 페이지를 요청할 때 웹 서버가 미리 만들어 둔 정적인 HTML 파일의 데이터로 응답하는 것과 달리, 웹 서비스를 요청하면 웹 서버가 결과를 미리 만들어 놓지 않고 서버 프로그램이 HTML 데이터를 동적으로 만들어서 응답해요.

최근의 웹 서비스들은 시스템의 사용성을 높이기 위해 AJAX(Asynchronous Javascript ans XML) 라는 기술을 적용하고 있어요. AJAX는 웹 브라우저가 서버로 요청하는 것이 아닌, 자바스크립트 로 작성된 프로그램이 웹 서버와 통신을 해요. 그리고 응답 결과로 받은 내용에 대해서도 자바스크립트가 웹 페이지의 특정 부분에만 응답받은 내용이 갱신되도록 처리하죠. 따라서, 사용자는 전체 페이지를 다시 조회하지 않아도 되는 자연스러운 서비스 이용향상된 사용자 경험을 느낄 수 있죠.


세션을 유지하기 위한 쿠키

HTTP는 무상태 프로토콜이기 때문에 요청과 응답을 한 번씩 주고 받으면 후에 통신이 끊겨요. 그렇기 때문에 여러 단계의 흐름 처리를 할 때는 각 요청이 동일한 사용자가 보낸 것인지 아닌지 판단을 못 하죠. 이런 경우를 위해, 여러 건의 요청 처리를 동일한 사용자 접속 세션(Session)으로 인식할 수 있도록 쿠키(Cookie) 라는 걸 사용해요.

웹 브라우저는 서버와 통신하면서 응답받은 메시지에 'Set-Cookie:'라는 문자열이 있는지 확인하고, 만약 있으면 그 내용을 로컬 디스크에 쿠키 형태로 저장해요. 하지만 쿠키 정보는 악용될 경우 보안 문제가 발생하기 쉬워서 이데 대한 조치가 필요하답니다. 기본적으로 웹 브라우저는 이에 대한 방어책을 자체적으로 구현하고 있어요. 예를 들어, 쿠키가 생성된 웹서버와 동일한 도메인을 사용하는 웹 사이트에만 쿠키가 전송되도록 제한한다거나, 저장된 쿠키들의 유효기간이 지난 것들은 자동으로 폐기해서 보안조치를 하죠.

물론 이렇게 악용을 방지할 수도 있지만, 처음부터 보안 문제가 생길 만한 정보는 클라이언트의 쿠키에 저장하지 말아야 해요. 기본적으로는 각종 정보를 서버에 저장하는 것이 원칙이고, 동일한 사용자인지 확인하기 위한 세션 ID 등의 식별 정보만이 클라이언트 쿠키에 저장하도록 제한하죠.


이메일

이메일을 송수신할 때는 SMTP , POP , IMAP 와 같이 여러 프로토콜들을 사용해요. 이메일을 발신할 때는 주로 SMTP(Simple Mail Transfer Protocol)를 사용하고, 수신할 때는 POP(Post Office Protocol)을 사용하죠.

여기서 SMTP 프로토콜은 클라이언트가 서버로 메일을 보낼 때만 사용되는 것이 아니라, 발신자의 메일 서버에서 수신자의 서버로 메일을 중계할 때도 사용돼요. 그리고 SMTP는 HTTP와 달리 스테이트풀(Stateful) 프로토콜이기 때문에 전송 종료 명령이 보내져야 통신을 종료하죠. SMTP는 POP과 달리 사용자 인증체계가 없어요. 따라서 POP 서버의 인증 기능을 활용하거나 SMTP Auth 프로토콜을 사용하여 악용을 방지해요.

수신자의 메일 서버에 저장된 메일을 확일 할 때는 POP 프로토콜을 사용해요. 메일 건수용량 확인, 메일 삭제와 같은 처리도 POP을 통해 실행하죠. 현재 쓰이는 버전은 POP3에요. 다른 프로토콜들은 버전을 명시하지 않는 경우가 많지만, POP 프로토콜은 하위 버전과 차이가 너무 커서 다른 버전과 혼용될 경우 오동작이 발생하기 때문에 명시하는 편이에요.

IMAP 프로토콜은 POP 프로토콜과달리 클라이언트가 메일을 수신하더라도 메일 서버에서 수신한 메일을 지우지 않고 보관하게 돼있어요. 이러한 방식 덕분에 메일 저장 공간이 충분하지 않은 스마트폰 등의 휴대기기에서 많이 활용되죠.


PC끼리 파일 공유하기

파일 공유 는 개인 컴퓨터에서 많이 사용되는 방법으로 공유에 참여하는 각각의 컴퓨터가 서로 서버가 되기도 하고 클라이언트가 되기도 하는 피어 투 피어(P2P, Peer to Peer) 방식을 사용해요. 공유를 위해 특별히 서버를 준비할 필요가 없죠.

그렇기 때문에 파일 공유는 중앙에서 관리하는 서버가 없어요. 일단 컴퓨터가 네트워크에 연결되면 다른 컴퓨터들에게 자신의 연결을 통보하죠. 그러면 다른 컴퓨터들도 자신의 정보를 응답으로 알려주고, 결과적으로 네트워크 전체에서 서로를 식별하게 됩니다.

파일 공유 프로토콜은 기본적으로 OS마다 달라요. 윈도우는 SMB(Server Message Block), 맥은 AFP(Apple Filing Protocol)을 사용하는데 최근에는 간단한 설정만으로 서로 다른 OS의 프로토콜도 지원할 수 있다고 해요.


파일을 전송하는 FTP

FTP(File Transfer Protocol) 은 파일 전송 프로토콜로, 주로 인터넷에 연결될 서버에 파일을 전송할 때 사용돼요. 주로 웹 서버로 웹 페이지를 전송할 때 자주 사용되는데, FTP로 웹 서버에 HTML 파일을 전송하고 이를 서버가 HTTP를 통해 서비스하는 것이 가능해요.

FTP는 크게 파일을 주고 받기 위한 데이터 커넥션과 명령어를 보내기 위한 컨트롤 커넥션 두 가지 접속 형태를 사용해요. 접속 형태가 분리돼있기 때문에 파일 전송 중에도 명령이 가능하죠.

FTP 서비스에서는 서버 내부에서 외부로 나가는 통신을 방화벽이 차단하여 파일 전송이 안될 수도 있는데, 이 때 패시브 모드(Passive mode)를 사용하여 역으로 클라이언트에서 서버에게 데이터 커넥션을 만들어 파일을 전송할 수 있어요.


원격지의 컴퓨터 제어하기

Telnet 이나 SSH(Secure SHell) 는 원격지의 컴퓨터를 명령어로 제어하기 위한 프로토콜로, 물리적으로 먼 거리에 있는 서버들을 관리할 때는 이 프로토콜들을 사용하는 것이 일반적이에요. Telnet과 SSH는 명령 프롬프트에서 명령을 내려 서버로 전달하는데, 명령에 대한 결과는 마치 서버 앞에 잇는 것처럼 텍스트로 표시돼요.

만약 원격지 컴퓨터의 데스크톱을 제어하려면, 윈도우에 내장된 RDP(Remote Desktop Protocol) 프로토콜이나 OS에서 범용적으로 사용되는 VNC(Virtual Network Computing)를 위한 RFB(Remote FrameBuffer) 프로토콜을 사용하면 돼요. 이들은 GUI 인터페이스를 사용하기에 마우스나 키보드의 제어 정보를 서버로 보내면 원격 서버의 화면 이미지를 그대로 응답 받을 수 이써서 편리해요. 대신 이러한 기술은 화면 이미지의 데이터 크기를 줄여주는 압축 기술도 함꼐 사용되야겠죠.


Voice over IP와 영상 스트리밍

현시대는 과거와 달리 음성이나 동영상 파일들을 일사에서 주고 받는 것이 보편화 돼있죠. 스마트폰에서는 주로 VoIP(Voice over IP) 와 같은 기술들이 사용되는데요. 음성이나 동영상 데이터들은 다른 데이터들에 비해 상대적으로 용량이 크기 때문에 통신의 신뢰성(TCP)보다는 전송 속도를 중시하는 UDP 를 사용해요. 그리고 전송 시에는 데이터를 압축하되 수신된 정보를 바로 재생할 수 있도록 해주는 스트리밍 기술도 함께 사용하죠.

예를들어, VoIP 같은 기술은 데이터를 짧은 간격으로 쪼개어 압축해서 순서대로 전송해요. 그럼 수신자 쪽에서 전송받은 데이터를 도착하자마자 순서대로 재생하죠. 이는 전송중에 일부 데이터가 누락되더라도 속도를 중시하기 때문에 별 신경 쓰지 않아요.

음성 또는 동영상을 주고 받는 서비스들은 주로 직접 통신하는 P2P 방식을 선호해요. 하지만, 이런 방식은 통신 상대를 찾는 것이 어려울 수 있기에, 우선 클라이언트 서버 방식으로 디렉터리 서버에 접속하여 상대를 찾은 후 P2P로 넘어가는 하이브리드 방식도 많이 활용돼요.

유튜브와 같은 도영상 공유 서비스에서는 도영상 프로토콜에서 사용할 데이터를 HTTP 메시지 안에 채워 넣는 기술을 사용하기도 해요. HTTP를 쓴다면 일부 네트워크 환경에서 차단되는 경우가 거의 없기 때문에, 더 많은 환경에서 서비스가 가능하죠.


크롬 개발 도구로 HTTP 메시지 살펴보기

웹 브라우저와 웹 서버 간에는 수 많은 HTTP 메시지 가 오가죠. 크롬 개발자 도구 를 통해서 앞서 설명했던 브라우저와 서버 간의 HTTP 통신 과정을 살펴볼 수 있어요.

크롬 개발자 도구를 연 다음 Network 탭으로 들어가면, 실제로 웹 페이지가 표시되기까지 주고 받은 HTTP 요청의 목록이 표시되는 것을 확인할 수 있어요. 여기서 목록 중 도메인 주소를 누르고 Headers 탭으로 들어가면 클라이언트와 서버가 주고 받은 응답 헤더와 요청 헤더도 확인할 수 있어요. 그리고 위에서 설명했던 쿠키도 Cookies 탭을 통해 확인할 수 있답니다.



트랜스포트 계층

앞서 설명했던 애플리케이션 계층은 과연 데이터를 어떻게 전달받을까요?

다른 컴퓨터로부터 받은 데이터를 각 프로그램, 즉 애플리케이션에 전달하는 것이 바로 트랜스포트 계층 이 하는 일이에요. 여러 컴퓨터로부터 받은 데이터들은 트랜스포트 계층에서 분류된 후에 애플리케이션 계층의 프로그램에 전달되는데, 이 때 사용되는 분류 기준이 바로 포트 번호 입니다.

트랜스포트 계층의 프로토콜은 대표적으로 TCPUDP , 이 두 가지가 있는데요. TCP같은 경우, 웹이나 이메일과 같이 데이터가 정확하게 전달되어야 하는 통신에서 주로 이용돼요. 이와 달리 UDP는 VoIP나 동영상 스트리밍과 같이 전송 속도가 중요한 통신에서 주로 사용되죠.

트랜스포트 계층의 역할

트랜스포트 계층애플리케이션 계층과 인터넷 계층 사이에 위치한 계층이에요. 이의 역할은 바로 컴퓨터가 받은 데이터를 애플리케이션까지 전달하는 것이죠. 이 때 어떤 애플리케이션에 데이터를 전달할지 정하기 위해 포트 번호라는 것을 사용합니다.

그 중에서도 TCP 프로토콜은 데이터의 정확성을 추구하기 때문에, 유동적으로 전송 속도를 조절하기도 하고 수신지에 도달하지 않은 데이터를 재전송하기도 해요. 반대로, UDP 프로토콜의 경우 VoIP(인터넷 전화)나 동여상 스트리밍 서비스와 같이 실시간 통신이 필요할 경우 많이 쓰이는 프로토콜이에요.


포트 번호

트랜스포트 계층에는 인터넷 계층으로부터 다양한 종류의 패킷들을 전달받아요. 트랜스포트 계층 역시 이 패킷들을 애플리케이션 계층으로 전달해야되는데, 앞서 말했던 것처럼 이 때 포트 번호 를 이용하여 각 애플리케이션에 전달하는 거에요.

이 포트 번호는 IANA라는 단체에서 관리하는데, 번호에 따라서 구분돼요.

0 ~ 1023번 : 웰 노운 포트(well-know ports), 서버 프로그램이 수신 대기할 때 사용하는 포트
1024 ~ 49151번 : 레지스터드 포트(registered ports), 벤더가 할당받아 사용하는 포트
49152 ~ 65535번 : 다이나믹 포트(dynamic ports), 클라이언트 프로그램이 사용하는 포트

특히, 클라이언트가 사용하는 다이나믹 포트 의 경우, 때에 따라 비어 있는 포트 번호를 할당받기 때문에 어떤 번호가 사용될지 미리 알 수 없어요.

주요 웰 노운 포트
20번 : FTP(액티브 모드에서는 데이터 커넥션, 패시브 모드에서는 랜텀 포트를 사용)
21번 : FTP(컨트롤 커넥션)
22번 : SSH(원격 제어, 보안 기능 있음)
23번 : Telnet(원격 제어)
25번 : SMTP(이메일 전송)
80번 : HTTP(웹)
110번 : POP3(이메일 수신)
143번 : IMAP4(이메일 수신, 보관 기능 있음)

클라이언트와 서버가 통신하기 위해서는 먼저 클라이언트가 사용할 포트를 결정하고 이후 서버의 포트에 접속하게 돼요. 즉, 첫번째로 클라이언트가 사용할 포트를 할당 받아요. 이 때 서버는 이미 정해진 웰 노운 포트로 대기 중이죠. 그 다음 클라이언트에서 서버의 포트에 접속할 것을 요청해요. 이후 서버가 접속을 허용하면 이 둘은 통신 가능한 상태가 된답니다. 만약 통신이 종료되면 클라이언트는 할당받은 포트를 다시 반납하게 돼요.

이 때, 만약 서로 다른 클라이언트들의 포트 번호가 겹치면 어쩌나 걱정하실 수도 있어요. 하지만 서버는 클라이언트를 식별할 때, IP 어드레스와 포트 번호를 조합하여 구분하기 때문에 여러 클라이언트와 통신하는 상황에서도 혼선이 발생하지 않아요.


TCP가 정확하게 데이터를 전달하는 방법

앞서 설명했던 것처럼 TCP 는 정확한 데이터 전달이 필요한 통신에 이용돼요. TCP는 데이터 전송에 신뢰성을 더하기 위해 데이터를 세그먼트(Segment) 라는 단위로 분할해서 사용해요. 분할된 데이터를 통해 전송 속도를 조정하고 데이터가 전달되지 않았을 때 재전송을 해요.

수신 컴퓨터가 데이터의 양을 다 못 받아들이려 한다면, 송신 컴퓨터에서 세그먼트의 전송량을 조절하고, 서로 주고 받은 바이트 수를 비교해서 차이가 있다면 재전송하는 원리이죠.

TCP의 세그먼트는 데이터 본체에 TCP 헤더(TCP Header) 가 붙은 형태에요. TCP 헤더에는 포트 번호일련번호와 같은 정보가 포함되어 있어요.

데이터 본체 위에 그려진게 TCP 헤더 에요. 저기 일련번호는 송신한 바이트 수, 확인 응답 번호는 수신한 바이트 수에요. 이 둘을 비교하여 데이터들이 정확히 도달했는지 확인 할 수 있죠. 데이터 옵셋윈도우 사이즈, 체크섬은 각각 TCP헤더의 길이, 한 번에 수신할 수 있는 데이터 크기, 그리고 데이터가 훼손되었는지를 나타내요.

이 중에서도 컨트롤 비트 는 현재의 통신 상태를 표현하는 플래그 역할을 해요. 즉, 통신 상대에게 정보를 전달해서 TCP 통신을 제어하는 용도로 쓰이죠. 밑의 플래그들은 각각 1비트 크기를 차지하며 ON/OFF 두 가지 상태로 표현해요.

CWR : 통신 경로가 혼잡해서 전송량을 줄여줄 것을 알림
ECE : 통신 경로가 혼잡해서 수신할 수 없을 수도 있다는 것을 알림
URG : 긴급 포인터에서 지정한 데이터를 즉시 처리해야 한다는 것을 알림
ACK : 이전 동작을 확인했다는 것을 알림. 확인 응답 번호와 조합해서 사용
PSH : 수신 데이터를 즉시 애플리케이션 계층에 전달해야 한다는 것을 알림
RST : 이상 상황이 발생하여 접속이 강제 중단되었다는 것을 알림
SYN : 접속을 시작할 때 ON으로 설정
FIN : 데이터 송신이 완료되어 통신을 종료하고 싶다는 것을 알림

TCP 통신은 커넥션 연결에서 시작해요.

커넥션을 맺는 과정은 위와 같이 3단계로 진행되기 때문에 3방향 핸드셰이크(3-way handshake)라고도 불러요. 커넥션을 맺은 이후부터는 데이터를 전송할 수 있는 상태가 돼요.

여기서 ACK 는 데이터가 잘 도착했다는 확인 응답을 하기 위한 플래그에요. 만약 ASK가 ON으로 설정된 패킷이 응답되지 않는다면 데이터가 제대로 전달되지 않은 것으로 간주한답니다.

커넥션을 맺을 때 양 컴퓨터는 원활한 통신을 위해 미리 일련번호최대 세그먼트 크기(MSS, Maximum Segment Size)를 서로 합의하고 조융하는 과정을 거쳐요. 이 때 서로 제시한 MSS의 크기가 다르다면 둘 중 작은 값으로 합의해요.

데이터가 전송 되는 과정에서 일련번호가 변경되는 것은 조금 헷갈릴 수도 있어요. 두 컴퓨터가 서로 커넥션을 맺는 과정에서 일련번호는 1씩 증가해요. 만약 데이터를 전송한다면 일련번호에 전송한 데이터의 바이트 수만큼 더 더해져요. 여기서 데이터를 수신한 후에는 수신한 데이터의 바이트 수만큼 확인 응답 번호에 더해지죠. 따라서 이 덕분에 일련번호와 확인 응답 번호로 몇 바이트의 데이터를 주고 받았는지 확인 할 수 있는거죠.

예시로 MSS가 1000이고, 클라이언트는 800바이트, 서버는 2000바이트의 데이터를 보내고 싶은 상황을 표현해볼게요.

  1. 클라이언트가 800바이트의 데이터를 서버로 보낸다. (이 때, 일련번호와 확인 응답 번호는 각각 커넥션 과정에서 1을 받음)
  2. 서버가 800바이트를 받아 확인 응답 번호가 801이 된다. 그리고 서버가 클라이언트에게 응답과 함께 1000바이트를 보낸다. (MSS가 1000이기 때문에 2000바이트를 한 번에 보낼 수 없음)
  3. 클라이언트가 1000바이트를 받아 확인 응답 번호가 1001이 되고 일련번호는 이전에 보냈던 800을 더해 801이 된다. 그리고 클라이언트가 서버에게 응답한다.
  4. 서버의 일련번호는 이전에 보냈던 1000을 더해 1001이 된다. 그리고 서버가 클라이언트에게 응답과 함께 남은 1000바이트를 보낸다.
  5. 클라이언트가 1000바이트를 받아 확인 응답 번호가 2001이 된다. 그리고 클라라이언트가 서버에게 응답한다.
  6. 최종적으로 일련번호와 확인 응답 번호는 클라이언트가 각각 801, 2001, 그리고 서버가 2001, 801이다.

위와 같이 일련번호확인 응답 번호는 통신과정에서 계속해서 변해요. 이 둘의 값을 이용해서 TCP는 데이터가 제대로 송수신 되는지 확인한답니다.

만약 위 과정에서 패킷 일부나 응답 패킷이 전달되지 않았을 경우, 송신 측에서는 송신 실패로 간주해 최근에 정상적으로 응답받은 후부터 데이터를 재전송해요.

그리고 데이터 전송이 끝나면 이래와 같이 FIN 플래그를 이용해 커넥션을 끊어요.

앞선 방법처럼 데이터 송신과 응답이 번갈아 진행될 경우, 통신이 정상적으로 완료되기까지 많은 시간이 소요될 수 있어요. 그 대신에 응답을 기다리지 않고 연속된 데이터를 몰아서 보내면 전송 속도를 더 빠르게 향상시킬 수 있답니다.

다만 연속으로 몰아서 보낼 경우, 확인 응답 번호를 확인하는데 시차가 발생해요. 만약 위의 상황에서 전과 동일한 확인 응답 번호가 들어온다면 전송에 실패한 것으로 간주해요.

연속해서 보내는 양이 너무 많으면 수신 측이 제때 처리하지 못할 수 있는데, 이 때문에 수신 측은 수신한 데이터를 일시적으로 보관하는 버퍼(Buffer) 라는 저장 영역을 가져요. 수신 측은 TCP 헤더의 윈도우 사이즈에 이 버퍼의 크기정보를 넣어서 송신 측에 전달해요. 위와 같은 상황일 때, 윈도우 사이즈를 2000바이트로 설정해 놓는다면, 서버는 1000바이트 패킷을 2개까지만 몰아 보낼 수 있죠.

버퍼에 쌓인 데이터들은 순차적으로 꺼내서 처리돼요. 이 때 수신 컴퓨터의 성능이 좋지 않다면, 데이터 처리 속도가 수신 속도보다 느려 문제가 발생할 수도 있어요. 그래서 수신 컴퓨터는 매 응답마다 현재 수신 가능한 데이터양의 윈도우 사이즈를 설정해서 알려주죠. 이런 과정을 흐름 제어(Flow control) 이라고 불러요.

만약 버퍼가 꽉 찬다면, 윈도우 사이즈가 0으로 설정되고 데이터 전송이 일시적으로 멈춰요. 그리고 다시 전송을 재개할 경우에 송신 컴퓨터에서 탐색 패킷 또는 윈도우 프로브(Window probe) 를 수신 컴퓨터에 보내요. 수신 컴퓨터가 응답을 보내면, 현재 윈도우 사이즈를 확인하고 전송 재개 여부를 결정하죠.

버퍼에 빈 공간이 있어도 네트워크 경로가 혼잡한 경우 통신 속도를 낮춰야 할 수도 있어요. 이럴 때 인터넷 계층의 헤더 안에서 혼잡 플래그가 ON으로 설정되고, 양 측 컴퓨터는 ECE 플래그와 CWR 플래그를 사용해 통신 속도를 조절해요.


UDP가 고속으로 데이터를 전달하는 방법

TCP에 비하면 UDP 의 통신 과정은 정말 단순해요. 우선 통신을 시작할 때, 접속이 맺어졌는지 확인하지도 않고 바로 송신을 해요. 그리고 송수신 중 데이터 손실이 발생해도 이에 개의치 않죠. 심지어 버퍼에 데이터가 넘치더라도 그냥 둔답니다. 이는 보통 데이터가 조금 누락되더라도 제때 빠르게 전송되어야 하는 상황에 주로 쓰이기 때문이에요.

UDP에서는 패킷에 해당하는 것을 데이터그램 이라고 불러요. 여기에도 TCP에서처럼 UDP 헤더(UDP Header) 가 붙어요.

여기서 패킷 길이체크섬은 각각 헤더 길이와 데이터 길이의 합계, 데이터가 훼손되었는지 확인하기 위한 정보입니다.

UDP에는 하나의 패킷을 여러 수신지에 전달하는 브로드캐스트(Broadcast)멀티캐스트(Multicast) 라는 기능이 있어요. 특히 브로드캐스트는 파일 공유나 DHCP와 같이 네트워크 내의 여러 컴퓨터나 통신 장비와 정보를 교환할 때 사용돼요.

UDP를 사용하는 경우 중, 온라인 게임과 같은 서비스들은 데이터의 신뢰성이 속도 못지 않게 중요해요. 이럴 경우에 애플리케이션 계층에서 흐름 제어혼잡 제어(Congestion control) 를 구현해서 부족함 신뢰성을 보완해줘요.


netstat 명령으로 네트워크의 상태 확인하기

TCP나 UDP가 동작하는 것은 netstat 명령어를 통해 확인할 수 있어요. netstat 명령은 IP 어드레스프로토콜, 포트 번호 등을 목록으로 조회하게 해줘요.

$ netstat -n

여기서 -n은 IP 어드레서와 포트 번호를 숫자로 표시하라는 옵션이에요. 이 옵션을 주지 않는다면 호스트명과 프로토콜 이름을 조합한 형태로 표시된답니다.

ESTABLISHED : TCP로 접속이 맺어져 통신이 이루어지고 있다.
LISTEN : 서버가 수신 대기 상태다. -a 옵션을 통해 확인할 수 있다.
TIME_WAIT : 접속을 종료하려는 중이다.

로컬 주소 아래 표기된 숫자에서 172.16.137.67은 netstat 명령을 실행한 로컬 컴퓨터의 IP 어드레스이고 그 뒤의 54947과 같은 번호는 포트 번호에 해당해요. 외부 주소는 통신 상대의 수신 컴퓨터를 의미하고, 주소 맨 뒤 443은 포트 번호에 해당하죠. 이 443이라는 포트 번호는 HTTPS 프로토콜의 웰 노운 포트에요.



참고 자료


  1. 리브로웍스, 『(명쾌한 설명과 풍부한 그림으로 배우는) TCP/IP: 쉽게, 더 쉽게』, 제이펍(2016)

좋은 웹페이지 즐겨찾기