tcp 3way handshake에서 시퀀스 넘버는 왜 랜덤값으로 만들어질까?

Alex·2025년 3월 6일
0

CS를 공부하자

목록 보기
47/74

만약 시퀀스 번호를 0으로 시작해서 세그먼트를 보낸다고 해보자. 다음 세그먼트 번호는 100, 세번째 세그먼트 번호는 200으로 보낸다.

이때, 시퀀스 번호 100이 네트워크에서 지연되거나 손실이 됐다. 그리고 tcp연결이 종료됐다.
동일한 ip:포트로 새로운 연결이 생성되고, 다시 시퀀스 번호가 0으로 초기화된다.

그런데, 이전 연결에서 지연됐던 시퀀스 번호100 세그먼트가 이제야 도착했다면?

수신자는 지연된 패킷(시퀀스 번호 100)이 새 연결의 정상적인 패킷으로 오인할 수 있다.
이로 인해 데이터 손상이나 보안 문제가 발생할 수 있다.

이제 시퀀스 번호를 랜덤하게 시작해보자.

최초 연결에서 시퀀스 번호가 랜덤하게 500으로 시작하고, 다음 세그먼트는 시퀀스 번호 600으로 보낸다. 시퀀스 번호 600인 세그먼트가 지연되거나 손실된다.

새 연결이 다른 랜덤 값인 1025로 시작하고, 이전 연결의 지연된 시퀀스 번호 600 세그먼트가 도착했다.

수신자는 시퀀스 번호 600이 현재 연결의 유효범위(1025~)에서 벗어났다고 판단할 수 있다. 지연된 패킷을 쉽게 거부하고 데이터 무결성 유지가 가능해진다.

또한, 32비트 시퀀스 번호 공간에서 같은 번호가 다시 사용될 확률은 1/(2^32)로 매우 낮다. 랜덤 초기화를 통해 다음 시퀀스 번호를 예측하기가 훨씬 어려워지고, TCP 세션 하이재킹과 같은 공격에 대한 방어력을 크게 향상시킬 수 있다.

공격자가 TCP연결의 시퀀스 번호르 예측할 수 있으면 세션을 가로채거나 악성 패킷을 주입할 수 있다. 그래서, 랜덤으로 설정해서, 공격자가 올바른 번호를 추측하기 어렵게 만든다.

참고자료
Why in a TCP sequence, is a number taken as a random number and what is the actual number at the start?
Why do we have to each randomly generate a number and add one in the protocol handshake of TCP?

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글