TCP/IP라고 하면 인터넷 프로토콜 스위트에서 가장 자주 쓰는 방식 IP와 TCP를 한번에 부르는 것이다
IP주소를 기반으로 통신하는 IP 통신방법 과 패킷의 순서와 통신의 안정성을 보장하는 TCP 방식을 합쳐서 부르는 말을 일컷는다.
조금 더 쉽게 설명하여보면 우리가 컴퓨터로 네트워크를 통신한다고 하면 IP라는 주소를 통해 다른 컴퓨터를 찾아가는 것이다.
각 컴퓨터는 네트워크를 연결하기 위한 랜카드라는 것이 있는데 그 랜카드에는 제조 고유번호같은 Mac Address가 존재한다.
사람으로 치면 주민등록번호 같은 것이다.
(사람이 태어난 곳과 성별 등을 통해 주민등록번호가 부여되는 것처럼 Mac Address도 제조사와 제품번호 등으로 조합하여 만든다.)
대략 이렇게 생겼고 랜선을 꽂는 곳도 보인다
각 자 하나씩 가지고 있는 고유번호이기 때문에 Mac Address는 신뢰성이 있다.
(물론 고정해서 사용되지만 특정 경우 변경이 가능하고 글로벌로 봤을 땐 중복도 가능하다고는 한다.
하지만 우리가 쓰는 그룹 네트워크에선 중복이 될 수 없으니 간단히 고유한 속성을 가진다고 이해하고 넘어가자)
그러면 IP주소는 무엇인가?
이 이야기를 하면 이야기가 길어지기에 간단히면 설명하면 IP는 네트워크 상 여러분의 집주소와 같다.
그런데 집 주소는 같아도 안에 사는 주인이 바뀔 수 있는 것처럼 IP주소는 할당 받아서 사용하고 변경될 수 있다.
(현재 IP주소의 물량 부족에 따라) 또한 IP는 Mac Address를 기반으로 만든다.
이 개념에 대해 설명하려면 IPv4와 IPv6 , 공인 IP 와 사설 IP, CIDR 에 대해서 알아야 하지만 일단...너무 어려워지니
넘어가도록 하자.
그럼 왜 Mac Address를 가지고 상대방의 컴퓨터를 찾지 않고 IP를 이용하는 것일까? 답은 단순하다.
여러분의 주민등록번호로 여러분의 집을 찾는게 아니라 집주소를 가지고 집을 찾는 걸 생각하면 된다.
물론 주민등록번호를 이용하여 여러분의 집을 찾을 수도 있을것이다. '어딘가에 주민등록번호를 가진 사람이
어디에 산다'고 동사무서에 기록되어 있다면 말이다.
IP주소는 계층적인 특징을 가진다.
IP는 네트워크의 정보를 가진 부분과 호스트의 고유정보를 가진 부분으로 나뉘는데 네트워크 정보를 가진 곳에
가는 길에 대한 정보가 계층적으로 포함되어 있다.
예를 들어 서울특별시 영등포구 영등포본동 이라고 하면 서울시라는 큰 틀안에 영등포 구가 있고 그 영등포 구안에
영등포본동이 있다. 이렇게 큰 틀안에 작은틀이 포함되있는 관계를 계층적 관계라고 하는데 이런 절차로
네트워크의 목적지를 찾아 가는 것이다.
따라서 네트워크 목적지에 대한 루트의 정보를 가진 IP를 우리는 주소 찾는데 사용한다.
이렇게 IP주소를 가지고 상대방의 주소를 알아내고 통신을 하려고 하면 문제점이 생긴다.
내가 통신을 하기 위해 상대방 컴퓨터를 알아내고 연결을 하였지만, 내가 보내는 데이터가 순서대로 간다는 보장이
없거나 가는 중간에 데이터가 오염이 된다면?
그래서 나오는 것이 TCP이다. 우리가 TCP/IP라고 하는 것은 IP방식에 TCP방식으로 신뢰성을 더한다는 것이다.
TCP 기본적으로 3 way handshake를 기반으로 한다.
그럼 3 Way Handshake는 무엇일까?
3방향 악수? 정도로 해석되겠는데 쉽게 설명하자면 3번 확인해서 연결하는 방식이다.
방식에는 유명한 그림이 여기에 있다.
첫번째로 보내는자(Client)가 나 너한테 열어도 되니? 라고 물어보는 요청(SYN)을 보낸다. 그리고 받는 자(Server)가
그래 받을 준비 되어있어! 라고 SYN+ACK를 보낸다. 그럼 보내는 사람이 받는 사람이 받을 준비가 되어 있다고 이해하고
ACK를 날려 전송 시작을 알린다.
3 Way Handshake가 TCP 통신에서 중요한 이유는 바로 이 작업이 신뢰성과 흐름제어를 가능하게 하기 때문이다.
그럼 왜 2 Way Handshake도 있고 4 Way Handshake 도 있는데 TCP/IP의 연결할 때는 3 방식을 쓰는 것일까?
물론 4 Way Handshake도 쓰인다. 이것은 연결을 종료할 때 쓰인다. 그럼 2 Way는?
우리가 신서유기 나 가족오락관에서 하던 고요속의 외침을 생각해보면 된다.
필자가 애청하는 신서유기의 게임이다.
왼쪽이 발신자이고 오른쪽이 수신자라고 가정하자. 2 Way Handshake 방식이라고 가정하면
1. 발신자 고등어! 잘들리니? 라고 말한다.
2. 수신자 어! 잘들린다. 고등학교? 라고 말한다.
3. 수신자는 연결 잘 됨으로 인지하고 연결을 확립한다. (정답을 말한다.)
이렇게 되면 발신자 입장에선 수신자가 연결 받을 준비가 됬다는 걸 확인할 수 있지만 잘못 된 응답을 받고 있다는 걸
알수 있지만 수신자 입장에선 일방적으로 나 연결준비 됬어! 라고 말하는 거에서 끝나기 때문에 자신의 대답이 잘 된건지 확인 할 방법이 없다.
TCP/IP는 양방향 통신이다. 따라서 발신자의 내용이 잘 전달되는지도 중요하지만 수신자의 내용이 잘 전달되는 것도 중요하다. 이렇게 수신자도 발신자가 내가 보낸 내용을 잘 이해했는지에 대한 확인절차를 한번 더 거친다면 신뢰할 수 있는 연결을 만들수 있다. 이 방법은 3 Way Handshake에서 확립이 가능하다.
1. 발신자 고등러! 잘들리니? 라고 말한다.
2. 수신자 어! 잘들린다. 고등학교? 라고 말한다.
3. 발신자 어라? 고등학교? 잘 못알아 들은거 같은데? 틀렸어 라고 말한다.
4. 다시 연결을 시도하던지 연결을 하지 않는다.
고요속의외침에 심취하여 둘다 잘못된걸 알아듣고 잘들린다고 생각하면 어떻게 라고 하시는 문과적 심장을 가지신
분을 위해 상세 설명을 이어가겠다.
실제 TCP는 SYN과 ACK를 주고 받으면서 연결을 진행한다.
여기서 SYN은synchronize sequence number의 약자이고
ACK는acknowledgement의 약자이다.
1. 클라이언트가 자신의 목소리가 들리는 지 확인하기 위해 SYN란 임의로 생성한 난수를 보낸다. 예를 들어3979814995
SYN flag : 1
Sequence Number :3979814995
2. 만약 클라이언트로부터 서버가 잘 받았다는걸 확인시켜주는 메시지로
SYN,ACK를 보낸다면 확인을 뜻하는 ACK에 클라이언트가 보냈던 난수에 +1을 추가해
보낸다.
SYN flag : 1
ACK flag : 1
Sequence Number :1303920284
Acknowledgment Number : 3979814996(3979814995+1)
3.그럼 받는 클라이언트 입장에선 자신이 보낸 SYN을 알고있기 때문에 +1한 값과 같다면
통신에서 오류가 없었다는 걸 확인할 수 있다. 이 부분이 신뢰성에서 중요하다.
다시 서버가 보내준 응답이 잘 들린다는 뜻으로 서버가 보내준 SYN에 +1더하여
ACK에 넣어주고 서버에서 보내준다.
ACK flag : 1
Sequence Number :3979814996
Acknowledgment Number : 1303920285 (1303920284+1)
4. 서버는 자신이 보냈던 SYN을 알고있기 때문에 클라이언트로 부터 받았던 ACK이
SYN+1과 같다면 연결이 성공했다는걸 알수 있고 연결상태를 성립되었다는
ESTABLISHED의 상태로 만들어 연결을 지속한다.
참고로 이 내용들은 모두 패킷에 포함된 TCP Header에 저장되어 보내딘다.
이러한 TCP의 특징으로 첫번째 흐름제어가 가능하다.
송신자는 자신이 한 번에 얼마나 보내고 받을 수 있는지 끊임없이 확인한다.
TCP Header의 WIndow Size는 이렇게 한번에 받고 보낼수 있는 양을 정한다. WIndow Size는 수신자가 정한다.(3 -way handshake할 때) 그리고 지금까지 받은 데이터의 순서를 송신자에서 Acknowledgment Number로 알려준다. 이것이 그 다음 데이터의 순서로 지금 받은 번호에 1을 붙여서 송신자에게 보낸다. Sequence Number가 데이터의 순서번호를 표기한다.
따라서 데이터의 도착이 순차적으로 받아질 수 있다. 1번 다음엔 2번이 오게될 수 밖에 없음으로 패킷의 순서를 확인 가능해진다.
두번째 혼잡 제어가 가능하다.
Slow Start를 예로 들면 수신자와 송신자가 받을 준비가 넉넉히 되어있어도 네트워크가 혼잡하다면 제대로 된 송수신이 어렵다. 따라서 송신자는 연결 초기에 데이터 송출량을 낮게 잡고 보내면서 점점 송출량을 수신자의 상태를 확인하면서 늘린다.
이 역시 TCP Header에 WIndow Size에 대한 정보를 넣어주기 때문에 속도를 조절 가능하고 덕분에 혼잡 제어가 가능하다.