사실 three way handshake라는 개념을 면접준비를 하면서 알고는 있었습니다. 그때는 단지 "아~이런 개념이구나", 대답용으로만 공부를 했는데, 최근에 읽고 있는 "성공과 실패를 결정하는 1%의 네트워크 원리"에서 이 내용을 좀 더 자세하게 다루어주고, 혼자 찾아보면서 왜 tcp threeway hand shake인지에 대해 알게 되었습니다.
보통 TCP를 "연결 지향 서비스" 라고합니다. 말 그대로 연결되어 있는 상태를 지향하는 서비스입니다.
여기서 "연결"의 의미는 단순히 물리적인 연결을 의미하는 것이 아닙니다. 서로의 존재를 알고 있고, 서로 연결되어 있다고 약속을 하는 것이죠.
예를 들어, 나 - 부모님 / 나 - 여자친구 이 둘의 경우 각각 나와 연결 되어 있습니다. 첫번째의 경우는 물리적으로(DNA)연결되어 있지만 두번째의 경우는 논리적(서로 약속)으로 연결되어 있는 것이죠(정확한 예시인 것 같진 않지만 이런 느낌 입니다)
그렇다면 TCP는 왜 이런 연결되어 있는 상태를 지향할까요 ?
그 이유는, TCP 이름에서도 알 수 있듯이 Transmission Control Protocol, 전송 제어 프로토콜 → 연속적인 데이터 전송의 신뢰성을 보장하기 위해서 입니다.
그리고 이렇게 연결되어 있는 상태를 만드는 과정이 three way handshake입니다.
실제로 three way handshake과정은 송신자와 수신자가 패킷을 주고받으면서 이루어 집니다.
더 정확히 말하면 패킷의 tcp header에 있는 값들을 적당히 세팅하면서 이루어 집니다. 저희는 실제로 이런 과정이 어떻게 이루어 지는지 패킷분석 툴인 "와이어샤크로" 직접 확인해 보겠습니다.
패킷에는 다양한 헤더가 있는데, 그 중에서 저희는 tcp header만 보겠습니다. 그리고 실제로 tcp header에서 "sequence number", "Acknowledgement number", "ACK","SYN"만 알고 있으면 됩니다.
먼저 http://dalberghetti.com/ 에 접속합니다.
그러면 다음과 같은 화면이 나오고, 네트워크 탭에 보니 2개의 정보를 가져왔네요. 여기서 2개의 정보를 가져오기 전에 three way handshake를 먼저 합니다.
1. SYN
SYN flag : 1
Sequence Number : 3979814995
먼저 패킷의 tcp헤더 flag부분의 SYN값을 1로 바꾸고, Sequence Number에 3979814995을 넣어 수신자에게 보냅니다.
여기서 Sequence Number의 값은 난수입니다. 이 값은 나중에 실제로 데이터를 주고 받을 때, 기준이 되는 값으로 사용합니다.
여기서 Sequence Number가 난수인 이유는,
두 호스트가 connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용 됩니다. 따라서 두 호스트는 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재하는데 이때 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 숫자가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 수 있기 때문입니다.
2. SYN,ACK
SYN flag : 1
ACK flag : 1
Sequence Number : 1303920284
Acknowledgment Number : 3979814996
Acknowledgment Number은 첫번째 송신자가 보낸 Sequence Number에 +1을 한 값입니다. 내가 100을 보냈는데, 상대방이 101을 보내면 서로의 존재를 인지하고 있다라고 생각해도 되겠죠 ?
Sequence Number은 수신자가 생성한 난수 입니다.
3. ACK
ACK flag : 1
Sequence Number : 3979814996
Acknowledgment Number : 1303920285
Acknowledgment Number는 수신자가 보낸 Sequence Number에 +1을 한 값입니다. 마찬가지로 상대방이 보낸 숫자에 +1을 함으로 써 연결되었음을 확인할 수 있습니다.
three way handshake는 위와 총 3개의 과정으로 이루어 집니다. 이 과정이 모두 끝나게 되면 두 host는 논리적으로 연결되고 이제 데이터를 가져올 수 있습니다. 아까 위의 네트워크 탭에서 html파일과 이미지파일을 가져올 수 있습니다.
사진에서 보면 362~364라인에서 three way handshake가 끝나고 365라인에서 데이터를 가져오는 것을 확인할 수 있습니다. 이후 370라인에서 html파일을 가져오고, 374라인에서 다시 이미지 파일을 가져옵니다. 사진에는 보이지 않지만 443라인에서 HTTP/1.1 200 OK(JPEFG JFIF image)라고 나온 걸 확인할 수 있습니다.
그렇다면 여기서, TCP는 전송제어를 어떻게 하는 것일까요 ?
만약 내가 2번째 데이터를 받지 못했는데 3번째 데이터를 주려고 한다면 ? 내가 2번째 데이터를 받지 못했다는 것을 어떻게 확인할까요 ?
이것이 TCP의 핵심으로 TCP Header의 정보를 사용하여 확인할 수 있습니다. 이 부분은 다음 강좌에서 공부해보도록 하겠습니다.
'computer science > 네트워크' 카테고리의 다른 글
[네트워크] 서브넷 마스크와 서브네팅 (0) | 2020.01.31 |
---|---|
[네트워크] IPv4와 IPv6 (0) | 2020.01.30 |
[네트워크] HTTP (0) | 2020.01.29 |
[네트워크] OSI 7 Layer (0) | 2020.01.09 |
[네트워크] 4 way handshake (0) | 2019.12.18 |