더북(TheBook)

세그먼트가 누락되거나 순서가 뒤바뀌면 조금 번거로워진다. 그림 2-15를 보면, 호스트 A가 보낸 세그먼트 1301이 사라졌다. 호스트 A는 보내놓고 나서 1301이상의 ACK 번호 패킷이 오길 기다리고 있을 것이다. 시간이 초과하도록 ACK를 못 받으면 그제야 뭔가 잘못되었다는 걸 알게 되는데, 세그먼트 1301이 전달되지 못하고 사라졌던지, 호스트 B가 받기는 했는데 그 확인응답이 오던 도중 사라졌던지 둘 중 하나일 것이다. 어느 쪽이든 ACK를 받을 때까지 세그먼트 1301을 다시 보내야 하는 게 분명하다. 다시 보내려면 원래 데이터의 사본을 들고 있어야 하는데, TCP 동작에서 매우 중요한 부분이 바로 이것이다. TCP 모듈은 데이터를 모두 보낸 것을 확인응답받을 때까지 그 데이터를 한 바이트도 빠트리지 않고 들고 있다. 세그먼트를 잘 받았다는 ACK를 받은 후에야 이 데이터를 메모리에서 제거할 수 있다.

TCP는 데이터가 순서대로 도착하는 것도 보장한다. 기다리던 시퀀스 번호와는 다른 패킷을 호스트가 받을 경우 두 가지 처리 방법이 있다. 간단한 방법으로 순서가 안 맞는 패킷은 그냥 소각해 버리면서 원래 순서의 패킷이 도착하길 기다리는 것이다. 다른 방법은 일단 버퍼에 저장해 놓지만 ACK도 주지 않고, 응용 계층에 넘기지도 않고 그대로 갖고 있는 것이다. 이때 시퀀스 번호를 토대로 로컬 스트림 버퍼상 저장할 위치를 계산할 수 있다. 비어있던 앞쪽 세그먼트를 빠짐없이 모두 받았다면 그때 비로소 맨 마지막 세그먼트로 ACK를 날리고 통째로 응용 계층에 넘겨 계속 처리하게 한다. ACK는 그 앞의 데이터를 모두 받았다는 뜻이므로, 발신자는 마지막 ACK만 받았다고 해서 앞의 내용을 다시 보낼 필요가 없다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.