작은 메모장

9. TCP/IP 본문

실더스 루키즈 교육

9. TCP/IP

으앙내눈 2023. 12. 5. 17:33

Payload & Encapsulation

패킷을 전송하려면 패킷을 제어하는 정보가 필요

이는 Header, Trailer가 해당함

문제는 OSI 계층마다 원하는 정보가 다르다는 것

때문에 각각의 계층이 원하는 정보를 계속 담으면서 계속 인코딩을 해야함

이를 Payload라고 함

Encapsulation

캡슐화라고도 부르며, 주로 송신자측에서 캡슐화가 진행됨

상위계층(7계층)부터 하위 계층으로 내려오면서 계속 진행되며,

한 계층을 내려올때마다 제어정보가 추가됨

 

De-encapsulation

역캡슐화라고도 부르며, 주로 수신자측에서 역캡슐화가 진행됨

하위계층(1계층)부터 상위 계층으로 올라오면서 계속 진행되며,

한 계층을 올라올때마다 제어정보가 제거됨

각각의 계층은 이 정보가 자신에게 오는 정보가 맞는지 검증하고,

맞다면 통과, 아니라면 정보를 버림

TCP/IP Model

TCP/IP Model은 비상업적 통신모델의 또 다른 대표 모델로, 주로 사용하는 통신모델

- OSI Model: 인터넷 표준 기구가 만든 통신모델

- TCP/IP Model: 현업 네트워크 개발자가 사용하는 통신모델

 

TCP/IP 모델은 사실 간단한 모델이다. 불필요하게 나눠놓은 계층을 하나로 묶어 관리하겠다는 것.

1, 2계층을 하나로 묶어 EtherNet 계층,

3, 4계층을 하나로 묶어 TCP/IP Protocol,

5, 6, 7계층을 하나로 묶어 응용 계층으로 간주한다.

 

TCP/UDP Protocol

TCP

TCP 프로토콜의 스택은 다음을 사용한다

HTTP: WC와 WS 사이에서 평문의 웹문서를 송수신하는 프로토콜

HTTPS: WC와 WS 사이에서 암호화된 웹문서를 송수신하는 프로토콜, SSL(인증서) 매핑

SHTTP: WC와 WS 사이에서 암호화된 웹문서를 송수신하는 프로토콜, SSH(키) 매핑

FTP: FC와 FS 사이에서 파일을 송수신하는 프로토콜

FTPS: FC와 FS 사이에서 암호화된 파일을 송수신하는 프로토콜, SSL(인증서) 매핑

SFTP: FC와 FS 사이에서 암호화된 파일을 송수신하는 프로토콜, SSH(키) 매핑

* 21 - 제어용 데이터 전송용 포트 / 20 - 일반 데이터 전송용 포트

Telnet - 원격 제어 프로토콜(CUI)

SSH - 암호문 기반 원격 제어 프로토콜(CUI)
DNS - 도메인 기반 IP 룩업 프로토콜, TCP, UDP 전부 동작 가능

 

스택 내부에는 여러 종류의 헤더가 모여있으며,

각각의 계층이 필요한 헤더가 순서대로 캡슐화되어있는 상태로 저장되어 있음

 

TCP Header

기본적으로 TCP 헤더는 이러한 구조를 가지고 있고, 각 필드는 정해진 크기와 길이를 가지고 있다.

당연하게도 TCP 헤더가 없으면 데이터는 전송되지 않으며, 상단에 설명한 Encapsulation 과정을 거쳐 이 헤더가 만들어지게 된다.
 TCP 통신에서 가장 중요한 것은 SN(Sequence Number), AN(Acknowledgment Number)이다.

SN는 트래픽의 식별 번호로, 보내려는 트래픽의 순서라고 생각하면 된다.

AN는 트래픽의 응답 번호로, 요청한 데이터의 응답하려는 번호가 여기 들어가있다고 생각하면 된다. 즉, "내가 여기까지 받았다"라는 것을 나타내는 것.

 

TCP 통신은 크게 3가지로 나눌 수 있다.

데이터 전송 전 : 3-way handshake

데이터 전송 중 : 신뢰성 확인, 흐름 제어(데이터 전송량 제어)

데이터 전송 후 : 4-way handshake

 

TCP 3-Way Handshaking

통신을 시작하기 전 서로가 서로에게 통신을 시작할 준비가 되었는지 질의하는 과정으로, 총 3번의 트래픽을 주고받으며 통신을 시작한다.
TCP는 데이터를 전송할 때 데이터를 조각조각내서 보내게 된다. 그렇기 때문에 데이터를 전송할 때 무결성이 굉장히 중요한데, 서버와 클라이언트가 패킷 순서 연산에 문제가 있어 잘못된 헤더를 보내게 될 경우 데이터가 충돌하거나 버려질 수 있다. 때문에 서버 및 클라이언트 간 서로 이를 확인하는 과정이다.

실제 데이터는 이와 같이 표기된다.

진행 과정에서 가장 중요한 것은, SEQ Number값과 ACK Number값이 중요하다.
이는 TCP 헤더 안에 있는 영역으로 서로 이 값을 주고받으면서 유효성을 검사한다.

1. 클라이언트가 서버에게  SYN 요청을 전송한다.
클라이언트는 랜덤으로 SN(보통 0) 값을 생성하고, AN값은 0으로 한 후 서버에게 전송한다.
SN = 1000, AN = 0

2. 서버는 클라이언트에게 SYN + ACK 값을 전달한다.
서버는 클라이언트에게 받은 SN값에 "패킷순서를 잘 연산할 수 있음"을 나타내기 위해 SN에 1을 더해서 전송한다.
이때, 서버 또한 클라이언트를 검사하기 위해 AN 값을 랜덤으로(보통 0) 전송한다.
SN = 1001, AN = 2000

3. 클라이언트는 서버에게 ACK 값을 전달한다.
클라이언트도 마찬가지로, 서버에게 받은 AN값에 "패킷 순서를 잘 연산할 수 있음"을 나타내기 위해 AN에 1을 더해서 전송한다.
SN = 1001, AN = 2001

 

이 과정을 통해 클라이언트와 서버가 서로 패킷 순서를 확인하고 연산할 수 있는지 확인하였으며,

이 과정 직후 Application 데이터가 오고가게 된다.

 

4-way Handshaking

통신을 끝내기 전 서로가 서로에게 통신을 끝낼 준비가 되었는지 질의하는 과정으로, 총 4번의 트래픽을 주고받으며 통신을 시작한다.

 

1. 클라이언트가 서버에게 FIN 요청을 전송한다.

2. 서버는 클라이언트에게 ACK 값을 전송한다. 동시에, 해당 클라이언트와 연결된 프로세스에게 종료를 요청한다. 이를 CLOSE_WAIT 상태라고 부른다.

3. 프로세스가 정상적으로 종료되면, LAST_ACK 상태로 진입하며, 클라이언트에게 FIN 요청을 전송한다.

4. 클라이언트는 서버에게 ACK 값을 전송한다. 

 

조금 생각해봐야할 부분인데,

4번 과정에서 패킷이 Lose 되었다고 가정해보자.

클라이언트는 FIN 요청과 ACK 응답을 전부 수행하였고,

서버는 FIN 요청을 보냈으나 ACK 응답을 받지 못한 상태다.

이렇게 되면 클라이언트는 서버와의 세션이 끊어진 상태고, 서버는 클라이언트와 세션을 계속 열어두고 있는 상태다.

이런것이 계속 쌓이게 된다면 서버는 불필요한 세션이 계속 쌓이게 되고, 오버헤드로 서버가 멈출 것이다.

때문에, 이런 일을 방지하기 위해서 클라이언트는 ACK 응답을 보낸 후 세션을 바로 해제하지 않고 조금 기다렸다가 세션을 해제한다. ACK 응답이 Lose 되었다고 가정하고 행동하는 것.

 

UDP

UDP 프로토콜의 스택은 다음을 사용한다 

TCP와는 다르게, UDP의 헤더는 고정 길이 헤더를 가지고 있다.

즉, 데이터가 크나 작나 상관없이 헤더의 크기는 고정된다.

UDP 패킷은 무조건 데이터를 포함하고 있으며, 중간에 패킷이 Loss가 난다고 해도 재전송 요청을 하지 않는다.

 

 

TCP vs UDP

TCP UDP
Stream-Oriented Transport Protocol Message-Oriented Transport Protocol
상위계층에서 Payload된 데이터를 단편화 단편화 과정 없음
단편화로 다수의 데이터들과 네트워크 자원 공유 데이터 전송 완료 전까지는 다른 데이터 흐름에 영향받지 않음

 

 

IP Protocol

IP 프로토콜의 스택은 다음을 사용한다

IP 헤더는 총 20byte의 기본 길이와 옵션을 사용해서 최대 60byte까지 가질 수 있다.

 

MTU

네트워크 기기가 전송할 수 있는 최대 전송 단위로, 네트워크 환경에 따라 각각의 크기는 다름

대부분의 네트워크 환경에서는 1500 바이트로 통용되고 있음

 

단편화(Fragmentation)

MTU가 큰 네트워크에서 MTU가 작은 네트워크로 데이터그램이 전송될 경우, 테이터그램은 더 잘게 쪼개져서 보내져야 한다.

이렇게 쪼개진 데이터그램은 최종 목적지의 호스트에 의해서만 재조립이 되며, 재조립이 도착 후에만 되는 이유는 통신의 비효율성 때문이다.

단편화에 관여하는 필드는 Identification, Flag, Fragmentation offset이다.

단편화를 한다고 무작정 쪼개버리게 되면 뭐가 뭐랑 합쳐야할지, 그리고 어떤 순서로 맞춰야하는지 알 수가 없다.

때문에 Offset과 Identification을 이용해서 합쳐야할 파일들과 순서를 확인할 수 있다.

 

TTL

Time To Live, 데이터그램이 통과할 수 있는 최대 hop(홉)수

패킷이 라우터같은 전송장비를 하나 통과할때마다, TTL이 하나씩 감소한다.

TTL이 0이 되면 라우터에서 자동으로 폐기되며, 네트워크에서 불필요한 패킷이 남아있는 것을 방지한다.

재미있는 점은 OS 종류마다 TTL 값이 다른데, Linux에서는 64, Windows server에서는 128, Solaris 에서는 255를 가진다.