본문 바로가기
GP/NETWORK HACKING AND SECURITY

TCP

by sjs_2215 2018. 12. 17.

TCP는 Transmission Control Protocol이라는 글자의 약자를 딴 이름인데, 전송 제어 프로토콜 정도로 번역될 것 같다. 그러니까 안정적으로 패킷이 가지 못하는 경우 이걸 캐치해서 안정적으로 갈 수 있게 전송을 제어하는 역할을 하는 프로토콜이라는 뜻이다. 그런데 어떻게 불안정한 것 위에 안정성이라는 것을 보장해주는 것이 가능할까? 그 비결은 ACK 와 타임아웃, 그리고 재전송이다.

ACK 는 받은 걸 받았다고 알려주는 것을 의미한다. Acknowledgment 라는 영어 단어의 앞 세 글자를 딴 것인데 영어 단어에서 의미하듯, “잘 받았습니다.”라는 뜻이다. TCP 데이터가 물줄기처럼 흐른다고 해서 stream이라는 표현을 쓰는데, 이것도 복잡하니까 그냥 다들 그러는 것처럼 패킷이라고 하자. TCP는 패킷을 받을 때마다 ACK 이라는 별도의 패킷을 만들어서 “잘 받았습니다, 제가 다음에 받아야 하는 것은 몇 번 패킷입니다.”를 보낸 쪽에 알려준다. 그리고 보낸 쪽에서는 이걸 이용해서 잘 가고 있는지를 판단한다.

ACK 은 굉장히 고분고분한 착한 학생과 같다고 생각하면 된다. 매일 껨방에 출근 도장 찍던 착한 학생이 어느 순간 오지 않는다고 해보자. 그럼 껨방 주인아저씨는 매출 걱정보다 먼저 학생에게 무슨 일이 생겼다고 생각할 것이다. 우리 사회는 아직 훈훈하니까. 그리고 일정 기간 학생이 오지 않으면 심각한 일이 발생했다고 생각해서 경찰서에 신고할 것이다. 같은 일이 TCP 에서도 일어난다. 패킷을 받은 쪽은 ACK 을 보내서 패킷을 보내는 쪽에게 잘 받고 있다는 것을 알려주는데, ACK 이 일정 시간 동안 오지 않으면 패킷을 보내는 쪽에서는 특단의 조치를 취한다. 바로 다시 보내기이다.

ACK 이 오지 않는 경우는 두 가지를 생각해볼 수 있다. 보낸 패킷이 받는 쪽에 도착을 못해서 받는 쪽이 ACK 을 보내야 하는 것을 아예 모르는 경우와 받는 쪽은 패킷을 받았고 ACK 도 보냈는데 ACK 이 불안정한 IP 때문에 중간에 배달 사고를 만난 경우이다. 전자는 패킷을 다시 보내는 것이 말이 되는데 후자는 ACK 만 보내면 될 것 같다. 하지만 서로 통신을 못하는 상황에서는 이 둘을 효율적으로 구분하면서까지 문제를 해결하지는 못한다. 그 때문에 어떤 경우든 일정 시간 동안 ACK 을 못 받으면 패킷을 다시 보내버린다. 그게 약간 더 비효율적일 수 있지만, 상당히 더 확실하고 속 편한 방법이다.

정리하자면, TCP는 패킷을 보낼 때 다음 그림과 같은 일을 겪는다. 1) 받은 패킷에 대해서 잘 받았다는 뜻으로 ACK 을 보내준다. 2) ACK 을 일정 시간 동안 못 받으면 원래 패킷을 재전송한다.

▲ TCP는 ACK 이라는 특별한 패킷을 이용해서 받는 쪽에 패킷이 잘 도착했다는 것을 알려준다. 그런데 보내는 데이터가 유실되든, ACK 이 유실되든 할 때에는 이 ACK 이 전달될 수 없고, 보내는 쪽에서는 어떤 일이 발생했는지 알지도 못하게 된다. 그래서 보내는 쪽은 일정 시간이 지나는 동안 ACK 이 도착하지 않으면 바로 재전송한다.

원문보기:
http://www.inven.co.kr/webzine/news/?news=165870#csidx04d52caff5a1ddfbecf443e9ff008ef

Comments