Outline
TCP/IP는 L4인 TCP와 L3인 IP를 함께 묶어서 지칭하는 단어이다. 오랜 시간 신뢰성 있는 통신에서 많이 쓰여왔다. 지금부터 TCP/IP가 명확히 어떤 기능을 하고 어떤 원리로 신뢰성있게 데이터를 전달하는지 알아보자.
-
Job
TCP
응용 계층으로부터 요청 받은 데이터를 도착지 주소(IP, PORT)로 온전히 도착하게끔 관리.
외부로 부터 전달 받은 데이터의 도착지 주소(IP, Port)를 확인하여 적절한 프로세스에게 전달.
주요 서비스
- 포트 번호를 이용해서 데이터 전송
- 연결 생성
- 데이터 보증과 재 전송 제어
- 흐름 제어와 폭주 제어
IP
TCP로 부터 요청 받은 데이터를 라우팅을 통해 착지 주소를 보고 전달하는 프로토콜.
-
TCP
Concept
TCP Processing Flow of Kernel space
첫번째, 애플리케이션 프로세스가 소켓에 데이터를 기록한다.
두번째, 소켓에 기록된 데이터는 큐를 경유해서 커널 내 네트워크 처리 부분에 전달된다.
세번째, 커널에 전달된 데이터는 '소켓 버퍼'라는 메모리 영역에서 처리된다.
네번째, 데이터를 MSS에 따라 세그먼트에 담아 낼 수 있는 크기로 나눈다. 그 후에 TCP 헤더를 붙여 TCP 세그먼트를 생성한다.
MSS(Maximum Segment Size)
하나의 TCP 세그먼트로 전송할 수 있는 최대 크기를 뜻하며 MSS를 초과한 데이터는 자동적으로 분할돼서 복수의 TCP 세그먼트가 생성된다.
대부분의 MMS는 1460 Byte 이나, 데이터 링크 계층의 MTU(Maximum transmission Unit, 최대 전송 단위)에 따라 변동 될 수 있다.
TCP 헤더
헤더에는 도착지 주소(Port 번호)를 포함해 TCP 기능에 필요한 정보가 기록된다.
Generating Connection
TCP는 연결형 프로토콜로 연결이라 분리는 가상 경로(Virtual Circuit)을 생성한다.이것은 TCP가 통신을 시작하면서 통신 상대에게 '지금부터 통신한다'리고 연락한 후 'OK' 사인을 받으면 그때 처음 생성된다. 물론 통신을 받으려면 통신을 받는 애플리케이션 (서버) 측 이 미리 통신 준비를 하고 있어야 한다. 서버 프로세스에게 '포트 번호 00 에게 통신의뢰가 오면 나에게 연결 해' 라고 한다. 이렇게 서버 측 소켓은 자신이 지정한 포트 번호에 통신이 오는지 기다렸다가 받는데 이 상태를 '포트를 리슨'하고 있다고 한다.
-
정리하자면 다음과 같다. 이를 3-way HandShaking 이란 방식이다.
- 커널 내 TCP 계층에서는 통신상대 서버에게 가상경로를 여어 줄 것을 의뢰한다.
- 통신 받는 측은 열어도 된다고 응답한다.
- 마지막으로 다시 한 번 확인했다는 메시지를 보내면 가상 경로가 생성된다. 실제로는 송신 측에도 자동적으로 포트 번호가 설정된 소켓이 열린다.
-
TCP가 연결이 맺어지면 별도로 끊어 달라고 하지 않는 이상 KeepAlive 타이머가 만료되기 전까지는 연결이 유지된다. 또한 전송 자체는 완전히 IP에 위임되므로 물리적인 경로가 막히거나(케이블 단선 등) 통신 상대 서버가 갑자기 셧다운됐을 때도 유지된다. 그렇기 때문에 사용이 완료된 연결은 그 이후부터는 낭비이므로 반드시 반납되어야 한다.
Data Guarantee and Re-sending Control
연결이 생성된 후에야 데이터 송수신이 시작된다. TCP에는 데이터가 확실히 전달되도록 보증하는 기능이 있다. 위 사진에서 왼쪽은 송신측, 오른쪽은 수신측 이다.
-
TCP의 신뢰성 있는 통신과 확인 응답과 재전송을 통해 이뤄진다.
10220 바이트의 데이터를 전송했을 때를 예로 들어보겠다. 송신되는 데이터는 바이트 단위로 시퀀스가 매겨진다. 이 시퀀스 번호는 수신측이 수신받은 바이트 데이터를 다시 재조립할 때도 사용한다.
- 송신측은 1-1460 바이트의 데이터를 수신측에 보낸다.
- 수신측은 데이터를 받고 난 후에 송신측에게 데이터가 잘 도착했다는 것을 알리는데 이를 ACK라고 한다. TCP 세그먼트 헤더에 ACK와 관련된 정보를 넣으며 그 정보에는 수신받아야하는 다음 바이트가 담긴다.
- 위 사진에서는 1461 부터 보내달란 의미에서 1461이 담긴 ACK를 반환했다.
- 송신측은 ACK를 확인해 기재되어있는 시퀀스 번호에 맞는 데이터를 다시 송신한다.(1461-2920 바이트가 담긴 데이터)
- 수신측이 2921바이트가 담긴 TCP세그먼트를 반환한다.
- 송신측은 ACK를 확인해 기재되어있는 시퀀스 번호에 맞는 데이터를 다시 송신한다.(2921-4380바이트가 담긴 데이터)
- 송신측에서 보낸 데이터가 도중에 유실되었다. 송신측은 수신측의 ACK가 조금 늦게 도착하는가보다 하고 그 다음 데이터를 보낸다(4381-5840)
- 수신측은 일정시간을 기다렸음에도 2921번 데이터가 도착하지 않아 ACK로 재요구를 한다.
- 송신측은 2921번 데이터가 도착하지 않았다는 ACK를 보고, 아직 2921번 데이터가 이동중인가보다 하고 판단하고 다음 데이터를 보내다.
- 수신측은 다시 기다렸지만 2921번 데이터가 도착하지 않아 재요청하는 ACK를 보낸다.
- 이처럼 같은 시퀀스의 데이터를 요청하는 ACK를 중복 ACK라고 하며, 3회 정도 같은 ACK가 도착하면 전송 간 문제가 있었던 것으로 판단하고 재전송한다.
-
위 사진을 보면 수신측이 2921번 데이터를 요청하는 ACK를 보내는 동안 시퀀스 번호가 4381, 5841, 7301인 세그먼트가 수신측으로부터 도착했다는 것을 알 수 있다. 수신측은 해당 세그먼트에 대해 수신 도착 ACK를 보내지 않았으므로 2921번 재전송 후에 4381번 세그먼트도 재전송할 수 있다.
SACK(Selective ACK)를 옵션을 사용하면 이미 도착한 세그먼트 정보를 전달함으로써 불필요한 재전송을 방지하고 시퀀스 10221번 데이터부터 받을 수 있다.
-
Flow Control and Congestion Control
데이터 전송과 ACK 전송으로 데이터 송수신이 이뤄질 경우 신뢰성은 높지만 시간이 많이 걸린다. 그래서 TCP 에서는 어느정도의 세그먼트 수라면 ACK를 기다리지 않고 전송하는 윈도우라는 개념을 가지고 있으며 ACK를 기다리지 않고 전송 가능한 데이터의 크기를 윈도우 크기라고 한다.
아래 사진을 바탕으로 설명을 이어가도록 하겠다.
윈도우에는 수신 윈도우와 송신윈도우 두가지가 있다. 아래에서는 5840바이트(4개 세그먼트) 가 윈도우 크기로 지정된다.
- 송신 측은 윈도우 크기 만큼 데이터를 보내고, 윈도우 내 시퀀스 번호 중 가장 작은 시퀀스 번호를 수신 받으면 윈도우를 아래로 이동한다.
- 데이터 통신 시작시에는 윈도우 크기가 1개 세그머트만 보낼 수 있는 사이즈엿다가 ACK 반환시마다 2세그먼트, 4세그먼트 식으로 지수함수적으로 늘려가는데 이를 슬로우 스타트(Slow Start) 라고한다.
- 수신 측은 수신된 데이터에 대해 ACK를 답하며 윈도우 내 수신 받아야 할 데이터의 시퀀스 번호 중 가장 낮은 데이터를 수신하면 윈도우를 아래로 이동한다.
- 수신 과정에서 소켓 버퍼가 가득차 더이상 받을 수 없게되면 이를 송신 측에 알려서 송신 윈도우의 크기를 수신 윈도우 크기와 동일하게 변경한다. 옵션에 따라 아예 크기를 1 세그먼트로 낮추는 경우도 있다.
-
설명드린 내용 외에 세부적인 옵션이 더 많으니 궁금한 분들은 별도로 심도있게 공부하길 추천한다.
-
IP
Definition
라우팅을 통해 지정한 대상 서버까지 전달받은 데이터를 전해주는 역할을 하는 프로토콜.
-
Concept
Routing
라우팅은 어떤 네트워크 안에서 통신 데이터를 보낼 최적의 경로를 선택하는 과정이다. 최적의 경로는 최단 거리가 될수도 있으며, 가장 빠른 시간에 전달하는 것으로 계산될수도 있다.
-
경로 선정의 기준은 옵션에 따라 달라질 수 있다.
-
Packet Structure
IP 패킷의 구성은 다음과 같다. 기존에 TCP에서 내려보낸 세그먼트(TCP 헤더 + 데이터) 에 IP 헤더를 더한 것이다.
- IP 헤더: 20 Byte / 버전, 전송 출발지 포트, 전송 도착지 포트, 체크섬, TTL 등으로 구성 된다.
- TCP 헤더: 20 Byte
- 데이터: 1460 Byte / 데이터 링크 계층의 MTU에 따라 MSS(Maximum Segement Size)가 달라질 수 있음.
-
TTL (Time to Live)
전송된 패킷의 생존시간 정보로 라우터를 지날 때 마다 1씩 줄어든다. TTL을 통해 라우팅 테이블에 오류가 생기는 등 문제가 생겼을 때 여러 네트워크를 떠도는 좀비 패킷이 되어 사라지지 않고 계속해서 이동하는 현상을 방지한다.
-
Reference
- TCP 개념 및 사진자료 - 그림으로 공부하는 IT 인프라 구조, 야마자키 야스시 외 3인
'Infra & DevOps > Network' 카테고리의 다른 글
게이트웨이 삽질 (0) | 2020.06.14 |
---|---|
[퍼온 글] DNS가 특정 포트를 가리킬 수 있는가? (0) | 2020.06.09 |
Private IP Range (0) | 2020.06.09 |
[퍼온 글] GARP의 정의와 활용 사례 (0) | 2020.06.03 |