TCP/IP는 아주 기본적이면서도, 서버, 네트워크 등을 가리지 않고 매우 중요한 개념이므로 알아보도록 하겠다.
인터넷 프로토콜 스위트(Internet Protocol Suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 통신규약(프로토콜)의 모음이다.
이 인터넷 프로토콜 스위트 중에서 TCP와 IP가 가장 많이 쓰인다.
TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP와 전송 조절 프로토콜인 TCP로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.
TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해 준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 수많은 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP라고 부른다.
TCP/IP를 사용하는 것은 IP 체계를 따르고 IP Routing을 이용해 목적지에 도달하며TCP
의 특성을 활용해 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지할 수 있도록 하겠다는 의미이다.
Transport Layer(4 Layer)
송신자와 수신자의 논리적 연결(Connection)을 담당하는 부분으로, 신뢰성 있는 연결을 유지할 수 있도록 도와준다. Endpoing(사용자) 간의 연결을 생성하고 데이터를 얼마나/제대로 보냈는지 받았는지 확인한다.
TCP
와UDP
가 대표적이다.
Network Layer(3 Layer)
IP(Internet Protocol)
이 활용되는 부분으로, 한 Endpoint가 다른 Endpoint로 가고자 할 경우, 경로와 목적지를 찾아준다. 이를 Routing이라고 하며 대역이 다른 IP들이 목적지를 향해 제대로 찾아갈 수 있도록 돕는 역할을 한다.
인터넷에서 다운로드할 때 끊기는 부분 없이 완벽하게 받을 수 있는 이유도 TCP의 이러한 특성(제대로 전달되었는지 확인) 덕분이라고 한다.
그렇기 때문에 위에서 언급한 것처럼 HTTP, HTTPS, FTP, SMTP 와 같이 데이터를 안정적으로 보내는 것을 중요시하는 프로토콜들의 기반이 된다.
받을 대상(노드, 호스트)이 서비스 가능 상태인지 확인하기 위해서는 해당 노드가 활성 상태인지 확인하기 위해 통신해야 한다.
TCP에서는 3-Way handshake라는 방식으로 해당 노드와 통신을 수행하게 된다.
3-Way-Handshake는 SYN, SYN-ACK, ACK단계로 나뉜다.
이러한 요청 단계는 TCP Flag라고 부른다.
SYN 단계
어플리케이션이 서버에 통신을 위한 연결을 요청하는 단계
SYN-ACK 단계
서버가 어플리케이션에 자신이 활성 상태임을 알리고 어플리케이션에서도 포트를 열어 활성화하라는 요청 메시지 전송
ACK 단계
어플리케이션이 서버의 요청 메시지를 수락하여 연결 수립
TCP는 OSI 7 Layer 중 4계층에 해당한다.
IP
가 패킷들의 관계를 이해하지 못하고 그저 목적지를 찾아가는 것에 중점을 둔다면,TCP
는 통신하고자 하는 양쪽 단말(Endpoint)이 통신할 준비가 되었는지, 데이터가 제대로 전송되었는지, 변질됐는지, 점검한다.
이런 정보는 TCP Header에 담겨 있으며, SYN, ACK, FIN, RST, Source Port, Destination Port, Sequence Number와 같은 신뢰성 보장과 흐름 제어, 혼잡 제어에 관한 요소들이 포함되어있다.
또한, IP Header와 TCP Header를 제외한 TCP가 실을 수 있는 데이터 크기를세그먼트
라고 부른다.
TCP는 IP 정보뿐만 아니라 Port를 이용하여 연결한다. TCP Header에 있는 Source Port와 Destination Port를 확인하여 통신한다.
흐름 제어
데이터를 송신하는 곳과 수신하는 곳의 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지하는 것
Stop and Wait : 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
이 Stop and Wait의 단점을 보완한 방식으로슬라이딩 윈도우 프로토콜
이 나왔는데,
수신측의 확인 신호를 받지 않더라도 미리 정해진 프레임의 수만큼 연속적으로 전송하는 방식이다.
송신자는 한 번에 얼마나 보낼 수 있는지, 수신자는 어디까지 받았는지 끊임없이 확인하고 TCP Header 내의Window size
를 사용해 한번에 받고 보낼 수 있는 데이터의 양을 정한다.
데이터는 받는 측이 더 중요하다 보니Window size
는 수신자가 정한다. (3-way handshake때 정한다.)
패킷의 왕복 시간(RTT)이 크다면,네트워크가 혼잡하다고 생각하여 윈도우 크기를 실제 버퍼의 크기보다 작게 설정
한다.
그리고 자신이 지금까지 받은 데이터 양을 확인하여 송신자에게 보내는데 이를Acknowledgement Number
라고 한다.
만약, 수신자가 300번 째 데이터를 받으면 301을 보낸다.
그리고 데이터의 순서 번호를 표기한 것이Sequence Number
다.
슬라이딩 윈도우 프로토콜
이라고 한다. 수신자가 처리할 수 있는 데이터의 양을 제한하고, 그 범위 내에서만 데이터를 전송하도록 한다. 윈도우 크기는 유동적으로 설정된다.
수신자의 버퍼 크기를 확인하고 최대한 전송 효율을 극대화한다.
오류 제어
TCP는 통신 중에 오류가 발생하면 해당 데이터를 재전송한다. 즉,
재전송 기반 오류 제어 ARQ(Automatic Repeat Request)
를 사용한다.
재전송은 비효율적으므로 적을수록 좋다.오류를 아는 방법
- 송신 측이 ACK를 받지 못함
- 송신 측이 보낸 데이터가 유실되거나, 수신 측이 보낸 ACK 데이터가 유실될 경우
- RTT(Round Trip Time) 및 RTO
- RTT는 TCP 연결에서 데이터 패킷이 송신자로부터 수신자에게 전송되고, 그에 대한 응답이 송신자에게 돌아오는 데 걸리는 시간을 측정한다.
- RTO는 전송된 패킷에 대한 응답을 기다리는 최대 시간이다. 이 시간내에 응답이 도착하지 않으면 TCP는 해당 패킷을 재전송한다.
- TTL - IP 패킷 관련
- TTL은 IP 패킷이 네트워크 내에서 살아있을 수 있는 최대 시간을 정의한다.
- IP패킷이 네트워크(라우터)를 통과할 때마다 그 패킷의 TTL값이 1씩 감소한다. 0이 되면 패킷은 더 이상 전송되지 않고 폐기된다.
- 무한히 순환하는 것을 방지.
- 중복된 ACK를 받음
Go Back N
연속으로 데이터를 보내다가
오류가 발생한 시점부터 재전송
하는 방식
아래처럼 4번 데이터에서 에러가 발생했다면 4번 이후의 데이터는 모두 삭제
성공적으로 전송된 데이터까지 재전송하기 때문에 조금 비효율적
Selective Repeat
오류가 발생한 데이터만 재전송
하는 방식
Selective Reat의 단점은 수신 측버퍼의 데이터가 순차적이지 않다
는 것이다.
정렬의 과정이 추가로 필요하고 별도의 버퍼가 필요하다.
혼잡 제어
네트워크 내에 패킷의 수가 과도하게 증가하는 현상을
혼잡
이라고 한다.
흐름 제어는 송신 측과 수신 측의 전송 속도를 다루고, 혼잡 제어는 라우터를 포함한 넓은 범위의 전송 문제를 다룬다.
데이터를 주고받는 양 단말(Endpoint)도 중요하지만 데이터가 지나가는 네트워크망의 혼잡 또한 중요하다. 다양한 방법 중에Slow Start
에 대해서 알아보겠다.
- 처음 TCP 연결이 시작할 때, Congestion window 값은 1 MSS(Maximum Segment Size)로 초기화된다.
- cwnd는 한 번에 전송할 수 있는 데이터의 양이다.
- cwnd를 전송마다 지수적으로(보통 2배) 증가시켜 전송률을 높여준다.
- timeout이 발생하면 cwnd를 1로 초기화 시키고 임곗값은 cwnd/2로 설정하고 다시 slow start과정을 반복한다.
- cwnd가 임곗값에 도달하면 congestion avoidance mode로 전환한다.
- congestion avoidance는 위 표에서 보이는 직선으로 올라가는 형태를 말한다.(2배로 증가하는게 아니라 1씩 증가를 한다)
송신자는 연결 초기에 데이터 송출량을 낮게 잡고 보내면서 수신자의 수신을 확인하며 데이터 송출량을 조금씩 늘린다.
그러다가 현재 네트워크에서 가장 적합한 데이터 송출량을 확인할 수 있다.
TCP/IP 네트워크 환경에서 3-way handshake로 연결을 했다면
4-way handshake
로 연결을 해제한다.
3-way handshake에서 한 단계가 늘어난 만큼 상세하게 설명해보도록 하겠다.
- 3-way handshake 때
SYN
TCP FLAG로 패킷을 먼저 보냈다면 4-way handshake에서는 클라이언트에서FIN
패킷을 보내고FIN_WAIT1
상태가 된다.- 서버는 클라이언트로부터
FIN
을 받고 응답 패킷ACK
를 보내고 상태는CLOSE_WAIT
가 된다.- 서버가 통신이 끝나면, 즉 연결을 종료할 준비가 되면 클라이언트에게
FIN
패킷을 보내고LAST_WAIT
상태가 된다.- 클라이언트는 확인 패킷
ACK
를 보내고TIME_WAIT
상태가 된다.
TCP에 대해서 집중적으로 알아보았는데 OSI 4계층에서 주로 사용되는 다른 프로토콜인
UDP
도 같이 알아보겠다.
UDP
는 비연결형 프로토콜로써, TCP처럼 서로 정보를 주고받을 때 정보를 보내거나 받는다는 신호 절차를 거치지 않고 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜이다.
이렇기 때문에, TCP와 달리 연결 설정이 없고, 혼잡 제어를 하지 않기 때문에 TCP보다 전송 속도가 빠르다. 하지만, 데이터 전송에 대한 보장을 하지 않기 때문에 패킷 손실이 발생할 수 있다.
- 비연결형 서비스
- 비신뢰성
- 데이터의 경계 구분
- 패킷 오버헤드가 적어 네트워크 부하 감소
- 혼잡 제어를 하지 않기 때문에 TCP보다 빠름
- handshake 같은 연결 설정이 없음
그림으로 알아보겠다.
https://cocoon1787.tistory.com/757
https://mangkyu.tistory.com/15
https://sh-safer.tistory.com/146
https://kotlinworld.com/94
https://aws-hyoh.tistory.com/entry/TCPIP-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0