3-way handshake
네트워크에서 클라이언트와 서버를 연결하고자 사용되는 3단계의 방법입니다.
예시로,
- A -> B : 내 말 들려?
- 연결 확인설정을 위하여 데이터 패킷(즉, 클라이언트가 통신에 사용하려는 임의의 시퀀스 넘버)보내는 단계입니다.
- B -> A : 잘 들려. 내 말은 들려?
- 1단계에서 받은 시퀀스 넘버에 1을 더한 ACK 값과
- B가 A로 부터 보내기 위한 다른 임의의 시퀀스 넘버를 클라이어트에 보냅니다.
- 이 시퀀스는 클라언트의 패킷을 올바르게 승인했음을 알려주고, 승인을 위해 자체 패킷을 전송합니다.
- A -> B : 잘 들려~~!
- 클라이언트가 시퀀스 번호(이 경우 Y+1)에 1을 추가하여 서버의 패킷을 확인하고 서버로 다시 보낼 차례입니다.
- 완료되면 연결이 생성되고 호스트와 서버가 통신할 수 있습니다.
상세설명
1단계 / SYN (synchronize sequence numbers) /
서버와 클라이언트 간의 연결 설정
먼저 서버와 클라이언트 간의 연결이 설정되므로 대상 서버에는 새 연결을 수락하고 시작할 수 있는 열린 포트가 있어야 합니다.
클라이언트 노드는 IP 네트워크를 통해 동일한 또는 외부 네트워크의 서버에 SYN(동기화 시퀀스 번호) 데이터 패킷을 보냅니다.
이 SYN 패킷은 클라이언트가 통신에 사용하려는 임의의 시퀀스 번호(예: X)입니다.
이 패킷의 목적은 서버가 새로운 연결을 위해 열려 있는지 묻거나 추론하는 것입니다.
Connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다.
따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용할 가능성이 존재한다.
서버 측에서 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 숫자가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 수 있어 이러한 문제 발생 가능성을 줄이기 위해 ISN을 무작위 난수로 사용하는 것이다.
2단계 / ACK (acknowledgements) /
서버는 클라이언트 노드에서 SYN 패킷을 수신합니다.
서버가 클라이언트 노드에서 SYN 패킷을 수신하면 응답하고 확인 확인(ACK(Acknowledgement Sequence Number) 패킷 또는 SYN/ACK 패킷)을 반환합니다. 이 패킷에는 두 개의 시퀀스 번호가 포함됩니다.
첫 번째는 서버가 클라이언트로부터 받은 시퀀스 번호(예: X+1)보다 하나 더 많이 설정한 ACK 1입니다.
두 번째는 서버에서 보낸 SYN으로, 다른 임의의 시퀀스 번호(예: Y)입니다.
이 시퀀스는 서버가 클라이언트의 패킷을 올바르게 승인했음을 나타내며, 이는 승인을 위해 자체 패킷도 전송합니다.
3단계 / ISN (Initial sequence numbers) /
클라이언트 노드는 서버로부터 SYN/ACK를 수신하고 ACK 패킷으로 응답합니다.
클라이언트 노드는 서버로부터 SYN/ACK를 수신하고 ACK 패킷으로 응답합니다. 다시 한 번, 각 측은 수신한 시퀀스 번호를 1씩 증가시켜 수신한 시퀀스 번호를 승인해야 합니다.
이제 클라이언트가 시퀀스 번호(이 경우 Y+1)에 1을 추가하여 서버의 패킷을 확인하고 서버로 다시 보낼 차례입니다.
이 과정이 완료되면 연결이 생성되고 호스트와 서버가 통신할 수 있습니다.
이 모든 단계는 연결의 안정성을 보장하기 위해 양쪽에서 시작된 일련 번호를 확인하는 데 필요합니다.
두 호스트 모두 상대방의 연결 매개변수를 확인해야 하므로 실제 데이터 전송 프로세스가 시작되기 전에 누락되거나 순서가 잘못된 세그먼트를 빠르게 감지할 수 있습니다.
'STUDY > Python' 카테고리의 다른 글
기술면접 스터디(9월27일 : 관심사 분리 | SOLID 원칙) (0) | 2022.09.27 |
---|---|
Method | get vs post (0) | 2022.09.23 |
HTTP와 HTTPS를 차이점 (0) | 2022.09.21 |
OSI 7계층 (0) | 2022.09.20 |
TODO 0901 (0) | 2022.09.01 |