본문 바로가기

javascript

TIL no.61 - 03 전송계층

제 3장 전송 계층에서의 키워드는 TCP, UDP, 신뢰성 있는 데이터 구조의 원리, 혼잡제어의 원리 를 다룬다.
강의와 책 참고 자료를 통해 공부 후 이 키워드에 대해 잘 이해하게 되기를 바란다.

 

 

< 계층 >   (하위로 흐름)

APP 메시지

TCP 데이터의 세그먼트로 들어온다 

Network 패킷안에 세그먼트가 데이터로 들어간다.

Link 전송 단위인 Frame 의 데이터로 들어간다.

 

 

 

 

 

 트랜스포트 계층 프로토콜 

서로 다른 호스트에서 동작하는 애플리케이션 프로세스 간의 논리적 통신을 제공한다.

애플리케이션 계층 프로토콜은 호스트 간의 논리적 통신을 제공한다는 점에서 차이가 있다.

트랜스포트 계층은 하위 네트워크 프로토콜이 비신뢰적일 때, 즉 네트워크 프로토콜이 패킷을 분실하거나 손상하거나 복사본을 만들 때에도, 애플리케이션에게 신뢰적인 데이터 전송 서비스를 제공할 수 있다.

 

 

 

인터넷 네트워크 프로토콜은 인터넷 프로토콜, 즉 IP 라고 부른다.

IP 서비스 모델은 호스트 간에 논리적 통신을 제공하는 최선형 전달 서비스이다.

이것은 IP가 통신하는 호스트들 간에 세그먼트를 전달하기 위해서 최대한 노력하지만, 어떤 보장도 하지 않는다는 것을 의미한다.

특히 IP는 세그먼트의 전달을 보장하지 않고 세그먼트가 순서대로 전달되는 것을 보장하지 않는다.

또한 IP는 세그먼트 내부 데이터의 무결성을 보장하지 않는다. 이러한 이유때문에 IP를 비신뢰적인 서비스라고 부른다.

각 호스트가 적어도 하나의 IP주소를 가지고 있다는 것을 기억하자.

*세그먼트 : 인터넷에서 트랜스포트 계층 패킷을 세그먼트라고 한다.

*패킷 : 네트워크 전송의 용량 단위로 전송될 때 서로 교환되는 실제의 내용물을 의미한다.

 

 

 

TCP/ IP 네트워크는 애플리케이션 계층에게 두 가지 구별되는 트랜스포트 계층 프로토콜을 제공한다.

UDP : 비신뢰적이고 비연결형인 서비스를 제공한다.

TCP : 신뢰적이고 연결지향형 서비스를 제공한다.

애플리케이션 개발자는 이 두 가지 트랜스포트 프로토콜 중의 하나를 명시해야 한다.

 

 

 UDP 와 TCP 의 공통 기능 

UDP 와 TCP 의 가장 기본적인 기능은 종단 시스템 사이의 IP 전달 서비스를 종단 시스템에서 동작하는 두 프로세스 간의 전달 서비스로 확장하는 것이다. 호스트 대 호스트 전달, 프로세스 대 프로세스 전달  로 확장하는 것을 트랜스포트 다중화역다중화 라고 부른다.

UDP 와 TCP 는 헤더에 오류 검출 필드를 포함함으로써 무결성 검사를 제공한다.

 

 

 

 연결형 트랜스포트 : TCP 

TCP 는 포인트 투 포인트 연결을 권장한다. 실제로는 sender 면서 receiver 이다. 데이터는 양방향으로 진행된다. 

각각의 포인트에서 send 버퍼, receive 버퍼를 가지고 있다. 

Pipedlined segments 를 사용한다. 

TCP 는 혼잡제어를 사용한다. 한 TCP 연결이 과도한 양의 트래픽으로 모든 통신하는 호스트들 사이의 스위치와 링크를 폭주되게 하는 것을 방지하는 것을 말한다. TCP 는 혼잡한 네트워크 링크에서 각 TCP 연결이 링크의 대역폭을 공평하게 공유하여 통과하도록 수행된다.

이것은 송신 측의 TCP 가 네트워크에 보낼 수 있는 트래픽을 조절함으로써 수행된다. 반면에 UDP 는 트래픽 조절되지 않고 애플리케이션이 허용 되는 한 그것이 만족하는 어떤 속도로도 전송 가능하다.

TCP 는 출발지 IP 주소, 출발지 포트 번호, 목적지 IP 주소, 목적지 포트 번호에 의해 식별한다.

 

"ACK 10" = 9번까지는 잘 받았으니 10번 보내줘.

( cummulative ACK )  누적해서 마지막에 보냄.

 

TCP 는 신뢰적인 데이터를 전송하기 위해 타임아웃을 사용한다.

손실 세그먼트를 복구하기 위해 타임아웃을 일으킨 세그먼트를 재전송하여 응답한다. 그리고 TCP 는 타이머를 다시 시작한다.

 

TCP 는 세그먼트의 타이머가 만료되기 이전에 손실 세그먼트를 재전송을 하는 빠른 재전송 ( fast retransmit ) 을 한다.

 

 

흐름제어

애플리케이션이 데이터 읽는 속도가 비교적 느리다면, 송신자가 점점 더 많은 데이터를 빠르게 전송함으로써 연결의 수신 버퍼에 아주 쉽게 오버플로를 발생시킨다. 이처럼 TCP 는 송신자가 수신자의 버퍼를 오버플로 시키는 것을 방지하기 위해서 애플리케이션에게 흐름제어 서비스를 제공한다.

 

 

*체크섬 : 에러를 체크해주는 부분

* ACK ( 응답문자 ) : 어떠한 컴퓨터가 네트워크를 통해 일련의 자료를 다른 컴퓨터로 성공적으로 전송했을 때, 전송을 받은 컴퓨터가 전송을 해 준 컴퓨터에게 보내는 신호로 정의된다. 이는 수신측 컴퓨터가 "준비 완료"의 뜻을 알리는 신호이기도 하다.

*RTT :  세그먼트가 목적지에 갔다가 ACK 까지 돌아오는 시간 (매번 다르다)

타임아웃을 잡기 위해 실제로 우리가 사용하는 RTT 값은 : TimeoutInterval = EstimatedRtt + 4*DevRTT

 

 비연결형 트랜스포트 : UDP 

UDP 는 목적지 IP 주소와 목적지 포트 번호로 식별한다.

 

 

그럼 애플리케이션 개발자가 UDP 보다 TCP 방식으로 애플리케이션을 개발하려고 할까 ?

더보기

대답은 NO 이다.

지금껏 설명해온 신뢰성 있는 TCP 의 특성들을 생각한다면 당연히 TCP 를 사용하겠구나. 그럼 어디서 UDP 를 사용할까 ? 라고 생각했었다. 그런데 애플리케이션 개발자는 TCP 보다 UDP 방식으로 애플리케이션을 개발하려고 한다. 왜인지 궁금할 것이다.

 

1. 무슨 데이터를 언제 보낼지에 대해 애플리케이션 레벨에서 더 정교한 제어

UDP 는 애플리케이션 프로세스가 데이터를 UDP 에게 전달 -> 데이터를 UDP 세그먼트로 생성 -> 세그먼트를 네트워크 계층으로 전달 한다.  반면에, TCP 는 혼잡제어 메커니즘을 가지고 있기 때문에 혼잡해지면 트랜스포트 계층 TCP 송신자를 조절하게 된다. 

또한 신뢰적인 전달이 얼마나 오래 걸리는지에 관계없이 목적지가 세그먼트의 수신 여부를 확인응답할 때까지 데이터의 세그먼트 재전송을 계속할 것이다. 

실시간 애플리케이션은 종종 최소 전송률을 요구하고, 지나치게 지연되는 세그먼트 전송을 원하지 않으며, 조금의 데이터 손실은 허용할 수 있으므로 TCP 의 서비스 모델은 이들의 요구와는 맞지 않는다.

 

2. 연결 설정이 없다.

TCP 는 데이터 전송 시작 전 세 방향 핸드셰이크를 사용한다. 반면에 UDP 는 형식적인 예비동작 없이 전송한다.

이말은 즉, UDP 를 사용한다면 데이터 전송에 있어서 어떠한 지연도 없을 것을 의미한다. 이것은 DNS 가 UDP 에서 동작하는지에 대한 일반적인 이유이다. HTTP 문서로 된 웹 페이지는 신뢰성이 중요하기 때문에 TCP 를 더 사용한다. 

 

3. 연결 상태가 없다.

TCP 는 종단 시스템에서 연결 상태를 유지한다. 반면 UDP 는 연결 상태를 유지하지 않으며 이 파라미터 중의 어떤 것도 기록하지 않는다. 그래서 일반적으로 특정 애플리케이션이 TCP 보다 UDP 에서 동작할 때 좀 더 많은 클라이언트를 수용할 수 있다.

 

4. 작은 패킷 헤더 오버헤드 

TCP 가 세그먼트마다 20 바이트의 헤더 오버헤드를 갖는 반면에 UDP 는 단지 8 바이트의 오버헤드를 가진다.

-> 위의 설명을 이해하고 나면 이제 어떤 애플리케이션에서 어떤 하위 트랜스포트 프로토콜을 사용할지 예측할 수 있을 것이다.

- 전자메일  SMTP

- 원격 터미널 접속  Telnet

- 웹  HTTP

- 파일 전송  FTP

- 원격 파일 서버   NFS

- 스트리밍 멀티미디어  (통상 독점 프로토콜)

- 인터넷 폰  (통상 독점 프로토콜)

- 네트워크 관리 SNMP

더보기

UDP 는 네트워크 관리 데이터를 전달하는데 사용된다. 네트워크 관리 애플리케이션은 네트워크가 혼잡한 상태에 있을 때 자주 동작해야 하므로 이러한 경우에는 UDP 가 TCP 보다 좋다.

- 이름 변환 DNS

 

 

 

 다중화와 역다중화 

다중화와 역다중화는 모든 컴퓨터 네트워크에서 필요하다.

다중화는 데이터를 보내기 전에 모으는 것을 말하고 역다중화는 데이터를 모은 것을 받아서 나누어 애플리케이션에서 필요한 적절한 곳에 보내는 것을 말한다.
네트워크 애플리케이션의 한 부분으로서 프로세스가 소켓을 가지고 있다는 것을 배웠다. 이를 통해 네트워크에서 프로세스로 데이터를 전달하며, 또한 프로세스로부터 네트워크로 데이터를 전달하는 출입구 역할을 한다. 소켓을 중간 매개자라고 볼 수 있다.

각각의 소켓은 어떤 하나의 유일한 식별자를 가진다. 이 식별자 포맷은 소켓이 UDP 소켓인지 또는 TCP 소켓인지에 따라서 달라진다.

역다중화 : 트랜스포트 계충 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업.

다중화 : 출발지 호스트에서 소켓으로부터 데이터를 모으고 이에 대한 세그먼트를 생성하기 위해서 각 데이터에 헤더 정보로 캡슐화하고, 그 세그먼트들을 네트워크 계층으로 전달하는 작업.

 

 

 

 혼잡제어의 원리 

네트워크 혼잡 원리를 처리하기 위해서 네트워크 혼잡을 일으키는 송신자를 억제하는 메커니즘이 필요하다.

혼잡이 왜 일어날까 ?

 

 

 

 

 

*sequence :  꼭 앞뒤가 지켜져야 하는 시·공간적 순서