TCP 에 대하여...
사실 하고 싶은 이야기는 SSL 에 대한 것이다.
프로젝트 당시 SSL 에 대해 자세히 몰라서 배포과정에서 꽤나 애를 먹었기 때문에
SSL 에 대해 탐구하고자 했다. 그러나 공부하다 보니, TCP부터 알아야 하더라.
그래서 TCP에 대한 이야기를 먼저 하고 SSL로 넘어가려한다.
TCP, SSL 에 대한 발표 영상
📺 https://www.youtube.com/watch?v=8rSdXqstN9g
USER 파트
KERNEL 파트
HardWare 파트
프로토콜
이라고 한다.프로토콜
은 여러 종류가 있다.Transport
의 TCP
에 대해 알아볼 것이다.TCP 추가정보
란 무엇일까.TCP 추가정보
이며, 이것을 TCP 세그먼트 헤드라고 한다.
- 연결지향형
- 신뢰적 데이터 전송
- 흐름제어
3-Way-Handshake
라고 한다.*** 추가 설명 ***
- 프로토콜의 개념을 잘 모르는 채 이 내용들을 보면, 실질적으로 어떻게 같은 계층끼리 이야기 하겠다는 것인지
잘 와닿지 않을 수 있다.
- TCP가 연결지향 통신을 한다는 것은 타 계층은 알지 못한다.
- 위에서 본 택배 포장하고 벗기는 것처럼, 각 층에서는 같은 계층이 포장한 것만 벗겨서 확인하기 때문에.
(자기한테 해당하는 포장만 본다)
- 그러니까 타 계층에서는 깔 일 이 없고 같은 층에서만 보므로, 그 층에서 봐야할 정보들을 적어두면,
상대와 나의 각 층 (transport---transport)은 서로 정보를 주고받으며 연결 될 수 있다는 이야기다.
- 그래서 앞으로 메세지를 주고받는 것을 그림으로 표시할 때도 모든 계층을 다 그리지는 않고,
특정계층의 입장에서 메세지를 주고받는 형태로 표시한다.
그림은 아래로 갈 수록 시간이 흐른다고 생각하면된다.
Transport
계층에서TCP
프로토콜로 통신할 때,
클라이언트는 서버에 인사악수를 건넨다. (ㅎㅇㅎㅇ)
서버는 클라이언트와 통신할 소켓을 열어준다.
클라이언트는 서버가 열어준 소켓에 대고 이야기를 한다.
자세히 그려보면 아래와 같다.
welcome socket
이라고 한다.그러면 이제 3-Way-handshake
를 자세히 보자.
SYN
, ACK
, seq
가 등장한다.SYN
: 연결 요청 비트ACK
: 응답 비트seq
: (=sequence:순서), 세그먼트구조 두 번째 줄의 '순서번호'에 해당위에서 부터 차례로 설명하면
1단계 (ㅎㅇㅎㅇ 내 말 들려?)
- SYN = 1
: 지금 보내는 이 세그먼트가 연결을 요청한다는 것을 알림
- seq = client_isn
: 내(=클라이언트)가 앞으로 보낼 메세지에 순서를 적어서 보낼 건데,
시작번호는 client_isn (어떤 숫자일 것이다.) 임을 알려줌
2단계 ( ㅇㅇ 들려. 너도 내 말 들려? )
- SYN = 1
: 나도 너에게 연결을 요청한다.
- ACK = client_isn+1
: 너가 보낸 메세지를 잘 받았다. 그러니 client_isn의 다음 메세지인 client_isn+1 번째 메세지를 보내달라.
- seq = server_isn
: 내(=서버)가 앞으로 보낼 메세지의 순서번호 시작은 server_isn 이다. (얘도 마찬가지로 어떤숫자임. clinet_isn과는 다른 숫자)
3단계 ( ㅇㅇㅇ 잘 들림~ )
- SYN = 0
: 연결요청은 끝났으니, 이 플래그 값은 0으로 바꿈.
(즉, 지금 이 3번째 세그먼트는 연결을 '요청'하는 세그먼트가 아니다.)
- ACK = server_isn+1
: 너가 보낸 메세지를 잘 받았다. 그러니 server_isn의 다음 메세지인 server_isn+1 번째 메세지를 보내달라.
- seq = client_isn+1
: 그리고 지금 보내는 이 세그먼트의 순서번호는 client_isn+1 이다.
이렇게 3번 주고 받으면 비로소 연결 설정이 끝난다.
네트워크를 통한 데이터 전송은 다양한 원인으로 데이터가 변형될 수 있다.
만약 이런 상황을 가정해 두지 않고 아무 대책도 세우지 않는다면, 정상적인 데이터 전송이 될 수 없다. 메세지를 받는 입장에서는 이게 맞는 정보인지 신뢰할 수 없다.
메세지를 신뢰한다는 말은 다음과 같다.
- 데이터가 손상되지 않는다.
- 데이터의 손실이나 중복이 없다.
- 데이터의 순서가 유지된다.
그래서 TCP는 신뢰적인 데이터 전송을 위해 마련한 대책이 존재한다.
- 확인 응답 ---- (3-2)
- 타이머 ------ (3-3)
- 순서번호 ---- (3-4)
TCP는 보낸 메세지에 대한 확인응답을 받는다. 즉 수신여부를 확인한다.
이미 " 2-2. 3-Way-handshake" 에서 그 과정을 보았다.
바로 ACK를 활용하는 방법이다.
이 ACK를 활용함에 따라 다음과 경우를 생각해 볼 수 있다.
상대로부터 ACK가 오지 않는다면 송신자의 입장에서는 위 두 가지 경우를 고려할 수 있다.
따라서 송신자는 ACK가 되돌아 오지 않으면, 해당 메세지를 다시 수신자에게 보낸다.
그렇게 되면 메세지가 중간에 누락되는 문제를 해결할 수 있다.
그런데, ACK를 '언제까지' 기다려야 오지 않는다고 판단 할 수 있을까?
ACK를 무작정 기다릴 수는 없을 것 같다. '언제까지'의 기준이 필요하다.
그래서 타이머
를 활용한다.
송신자는 RTT를 기준으로 언제까지 기다릴지 정한다.
RTT ( Round Trip Time )
: 송신자가 보낸 메세지가 수신자에게 도착하고,
수신자로부터 메세지를 받았다고 송신자에게 응답이 되돌아오는 시간
*** 참고 ***
RTT는 라우터의 혼잡 및 종단시스템에서의 부하가 실시간으로 변하기 때문에, 시시각각 그 값이 변한다.
그런환경을 반영하여 추정된 RTT의 (EstimatedRTT) 도출은 측정되는 RTT의 가중치를 두어 계산한다.
송신자는 RTT 정도면 ACK가 올 것이라고 생각하니 RTT+여유시간 동안 기다린다.
그럼에도 ACK가 되돌아오지 않으면, 타임아웃
으로 간주한다.
타임아웃
이 되면, 송신자는 수신자에게 해당 메세지를 재전송한다.
그런데 하나보내고 하나 응답받고, 하나보내고 다시 응답받고 하는 행동은 너무 느리고 비효율적인것 같다.
메세지를 연달아 여러 개를 보내면 좀 더 빠르게 처리할 수 있지 않을까?
이 처럼 '전송 후 대기' 를 일일히 하는 것 대신에, 여러개의 패킷을 전송하는 것을 파이프라이닝
이라고 한다.
파이프 라이닝은 전송 후 대기 기법에 비해 훨씬 더 많은 시간을 단축 할 수 있다.
위 그림에서도 알 수 있듯이, 병렬처리 된 만큼 시간이 단축된다.
얼마나 병렬적으로 처리할 것인지 N개의 개수를 정한다. 이것을 윈도우 크기
라고 한다.
패킷이 여러 개가 연달아 가므로, 패킷의 순서
를 표시한다.
순서는 TCP 세그먼트 구조에서 순서번호
에 표기한다.
2-2. 3-Way-handshake 의 마지막 절차그림에서 seq가 그것이다.
순서번호
를 활용한다면, 수신자는 패킷을 한번에 여러 개 받아도, 순서에 맞게 조립할 수 있다.
만약 송신자가 1,2,3,4 번의 패킷을 보내고,
수신자가 1,2,4 의 패킷만 받았다고 할 때, 3번을 못받았다고 어떻게 알려줄 수 있을까?
수신자는 위와같이 ACK에 받아야 할 패킷의 순서번호를 계속해서 응답한다.
그럼 송신자는 ACK=11 을 3번 연달아 받는다.
정상적으로 수신자가 다 받았다면 10 11 12 .. 이런식일 텐데, 11번이 연속으로 온 것은 수신측이 11 번 패킷을 정상적으로 못 받았음을 유추할 수 있다.
따라서 11번 패킷에 대한 타임아웃이 일어나기 전에 바로(빠른) 재전송을 한다.
수신측은 11번을 받고, 아까 13번까지 받아놨으니, 응답으로 13번 패킷을 달라고 ACK를 보낼 것이다.
결과적으로 수신측은 누락 없이 패킷을 받을 수 있다.
사실 TCP의 순서번호 및 재전송 과정을 알기 전에, 재전송 프로토콜인 GBN과 SR에 대한 배경지식이 필요하긴 하다.
위에 설명한 내용은 GBN과 SR이 결합된 TCP의 재전송 프로토콜에 대해 풀어서 설명했다.
GBN (Go-Back-N)
: 잃어버린 패킷번호부터 윈도우 크기 만큼 다 다시보냄SR (Selective-Reapeat)
: 잃어버린 패킷만 선별해서 다시보냄TCP는 위에서 설명한 신뢰적 전송 뿐만 아니라, 흐름제어 서비스를 제공한다.
흐름제어와 혼잡제어는 효율적인 데이터 전송속도를 위하여 송신자의 내보내는 속도를 조절한다.
역할은 비슷해 보이지만, 목적이 다르다.
흐름제어
는 수신자의 상태에 따라 송신자의 보내는 속도를 맞추고,혼잡제어
는 네트워크 환경에 따라 여러 송신자들이 보내는 속도를 조절시킨다.수신 윈도우 크기
라고 한다.흐름제어
이다.
*** 참고 ***
만약 그 여유공간이 0 일 때, 수신자가 여유공간이 없다고 말한 후 패킷을 읽고 공간을 비워내더라도
송신자는 여유공간이 생겼다는 메세지를 받을 답장이 없으므로, 무한 대기상태에 빠질 수 있다.
그래서 송신자는 여유공간이 0이어도, 1바이트짜리 세그먼트를 계속 전송한다.
혼잡 윈도우 크기
라고한다.혼잡 윈도우 크기
는 지수형태로 커진다.슬로우스타트 임계치
라고한다.혼잡회피
라고 한다.빠른회복
이라고 한다.4-Way-Handshake
이다.< 요약 >
- TCP는
Transport 계층의 프로토콜
로써,3-Way-Handshake
를 통해연결지향형 통신설정
을 하고파이프라이닝
,타이머
,확인응답
을 이용하여신뢰적인 데이터 전달
을 한다.- 또한 수신자 및 네트워크 환경에 따라
흐름제어, 혼잡제어로 전송속도를 조절
한다.
등등..
TCP에는 보안적으로 취약한 부분이 존재한다.
이를 보완하기 위해 Transport 계층과 Application 계층을 이어주는
보안 출입국을 하나 세운다. 그것이 SSL이다.
다음 장에서 SSL에 대하여 알아보자.