TCP 3-way handshake(세션 연결) & 4-way handshake(세션 종료)
why
TCP/IP는 인터넷 그 자체라고 봐도 무방할 정도로 전 세계의 네트워크를 지탱하는 프로토콜이다. 그래서 네트워크의
전반적인 질문들은 응용(HTTP) 아니면 TCP/IP로 나뉜다고 봐도 무방할 정도이다.
해당 질문은 TCP의 세션 연결과 세션 종료에 대한 질문으로 답변에 따라서 TCP의 성질을 잘 이해하고 있는지 TCP의
중요한 헤더 정보들을 알고 있는지 등등을 확인해볼 수 있다.
대학교에서도 꽤나 긴 시간의 강의를 진행하는 파트이기도 하고.. 시간이 지나면 정보가 흐릿해지는 부분이기도 해서
수월하게 답변하기가 까다로울 수 있다. [ 개인적으로는 중간 난이도 이상의 질문이다. ]
과거 나의 면접 답
메시지 요청을 보내는 클라이언트 측과 서비스를 처리하는 서버 측이 데이터를 안전하게 송수신하기 위한 연결 과정이라고 답변했다. 이후 구체적인 과정(flag를 이용)을 설명해달라는 요청을 받았지만.. 깔끔하게 답변하지 못했다.
나에게 점수를 준다면 이 또한 40점 미만의 점수.
중요한 정보들.
다음의 핵심 키워드들은 답변에 포함시키는 것이 좋다고 생각한다.
1. TCP는 연결 지향 프로토콜이라는 점.
2. "세션"을 연결하고 종료하기 위한 과정이라는 점.
3. 클라이언트 측과 서버측에서 보내는 패킷의 TCP 헤더 정보 & 각 호스트의 상태.
알아두면 좋은 정보 [ TCP는 연결 지향이라는 점, TCP 헤더 ]
TCP는 "연결지향"이다.
TCP는 IP 계층 위에 있는 계층이다. IP는 "데이터의 목적지"를 담당한다. 초기에는 IP계층만 두고 통신을 진행했는데
시간이 지나면서 패킷이 유실되고 순서대로 처리되지 않는 문제가 생기면서 TCP 계층을 IP계층 위에 추가하게 되었다.
인터넷 자체가 각 네트워크 디바이스끼리 서로 연결해서 통신하는 구조를 가지기 때문에(따로 중개자가 없다.) 데이터
전송에서 생기는 문제점을 제대로 해결하기 위해선 두 호스트가 안전하게 연결하게 연결을 맺어야 한다.
TCP의 주요 기능들
- 오류 제어, 흐름 제어, 타이머 재전송, 혼잡 제어 등의 기능을 한다. [ 이에 대해선 TCP 파트에서 깊게 들여다본다.]
- 위의 주요 기능들을 수행하기 위해서는 데이터를 전송하는 측과 데이터를 받는 측에서 데이터 전송을 위한 하나의 통로(Seesion)를 만들어야 한다.
TCP 헤더에 중요한 플래그 정보들
연결 설정과 관련해서 중요한 플래그 : ACK, SYN
연결 종료와 관련해서 중요한 플래그 : ACK, FIN
SYN(SYNchronization : 동기화)
- 데이터의 시퀀스 번호를 동기화해서 전송되는 데이터들이 문제없이 도착했을 때 확인하기 위한 번호이다.
ACK(Acknowledgement : 응답)
- 패킷을 받았다는 것을 알려주는 패킷이다. 보낸 사람의 시퀀스 번호에 + 1을해서 보낸다. ACK응답을 통해 패킷이
잘 전달되었는지 성공, 실패를 판단한다.
FIN(Finish : 종료)
- 세션 연결을 종료시킬 때 사용되면 더 이상 전송할 데이터가 없음을 의미한다.
클라이언트와 서버의 연결 : 3방향 핸드 셰이크
호스트가 보내는 패킷의 플래그 정보와 호스트의 상태의 요점을 둔다.
step1. 클라이언트의 세션 요청
step2. 서버의 응답
step3. 클라이언트의 확인
1. 클라이언트는 서버에 "세션 연결"을 요청하는 SYN 패킷을 보낸다.
- 클라이언트는 SYN을 보낸다
- 클라이언트는 서버 측의 (SYN/ACK) 응답을 대시하는 "SYN-SENT"상태가 된다.
[ 보내는 순간에는 서버 측은 클라이언트를 대기하는 (Wait For Client) 상태이다. ]
2. 서버는 클라이언트의 SYN 요청을 받고, A클라이언트에게 요청을 수락한다는 ACK(SYN+1)과 SYN을 보낸다.
- 서버는 응답으로 SYN + ACK이 설정된 패킷을 보낸다.
- 서버는 클라이언트 측에서 SYN을 받았다는 "SYN_RECEIVED"상태가 된다.
3. 클라이언트가 서버의 ACK을 받으면 세션이 설정(Established)이 된다.
- 클라이언트는 서버로 ACK를 보내서 서버에게 서버의 확인에 대한 응답을 보낸다.
- 클라이언트가 보낸 ACK를 서버가 받으면 ESTABLISHED 상태가 된다.
메타포로 설명해보자면 A와 B라는 아주 예절이 바른 친구들이 있다고 해보자.
1. A는 B에게 "우리 얘기 좀 나눌 수 있을까"라고 물어본다. A는 "소통"을 하자는 메시지를 보내고 "소통을 하자고 했어"
상태가 될 것이다.
2. B는 A의 소통 요청을 받고 "A의 소통 요청이 왔어!"상태가 되고 "소통하자"라는 응답을 보낸다.
3. A는 B의 응답을 보고 "소통 시작 준비"상태가 되고 B에게 "너의 소통 가능 응답을 받았다는 응답"을 보낸다.
B가 이 메시지를 받으면서 세션이 설정된다.
[ 적절한 메타포인지는 모르겠다... ]
중요한 것은 플래그 비트와 함께 어떤 상태가 되는지를 이해하는 것이다.
4-way handshake [ 연결 세션 종료. 작별의 시간 ]
작별의 시간. 둘의 통신 소켓이 다시 사용되기 위해서는 안전하게 소켓을 서로 닫아야 한다.
1. 클라이언트는 마지막 메시지라는 의미로 FIN 플래그를 1로 설정하고 패킷을 보낸다.
- 클라이언트는 FIN 플래그가 설정된 패킷 전송
- 클라이언트의 소켓은 서버가 FIN 플래그의 메시지 응답을 대기하는 FIN_WAIT 상태로 들어간다.
2. 서버는 클라이언트의 FIN을 확인하고 자신의 통신이 끝날 때까지 대기한다.
- 서버는 종료 요청 메시지에 대한 ACK응답을 보낸다. 그리고 자신의 통신을 마무리할 때까지 기다린다.
- 서버의 소켓 상태는 CLOSE-WAIT이다.
3. 서버가 통신이 끝났으면 연결이 종료되었다고 FIN 플래그를 1로 설정한 FIN 패킷을 보낸다.
- 서버는 애플리케이션에 통신 마무리가 끝났다는 것을 확인하고 FIN을 클라이언트로 보낸다.
- 서버의 상태는 "LAST_ACK" 상태가 된다. [ 마지막 응답 ]
4. 클라이언트는 서버에서 온 FIN을 받고 이에 대한 ACK를 보낸다.
- 클라이언트는 ACK를 보낸다.
- 서버에서 마저 오지 못한 데이터가 있을 수 있기에 TIME_WAIT로 잠시 대기하고 소켓을 닫는다.
- 서버는 클라이언트의 ACK를 받고 소켓을 닫는다.
마무리
직접 TCP 패킷을 들여다보는 과정을 경험할 일은 거의 없다.
TCP와 관련된 코드를 작성하게 될 일도 거의 없다. [ 상용 서버 프로그램과 웹 브라우저가 다 알아서 처리해주니.. ]
하지만 TCP의 연결 세션이 왜 존재하는지. 이를 위한 과정을 왜 거쳐야 하는지를 이해하려고 접근하다 보면은 TCP의
존재이유를 더 깊게 들여다 볼 수 있게된다.
Client와 Server측 그림에서 "Application"을 덧붙여서 이해해보면 좋을 것 같다.
현대에와서 APP과 OS가 소통하면서 소켓을 관리하므로(시스템 콜)!
이 부분은 깊게 들어가면 들어갈수록 설명해야 할 부분이 많아질 수 있다.
제일 적당한 것은 TCP의 플래그 비트로 설명하고 클라이언트와 서버의 상태를 기반으로 설명하는 것이 좋지 않을까
한다.
많은 블로그를 참고했다. 많은 분들이 정말 좋은 글을 남겨주셨다.
혹시나 틀린 부분이 있다면 댓글을 남겨주시길 바란다.
다음으로는 HTTP 1.0 -> HTTP1.1 -> HTTP2.0을 살펴보자.
HTTP의 Keep-alive헤더는 TCP의 3-way handshake와 관계가 있으니 해당 주제를 다음으로 선정하면 좋을 것 같다.
참고자료 [ 구글에 상당히 많은 자료가 있다. ]
'면접질문[CS] > 알고리즘 & OS' 카테고리의 다른 글
HTTPS와 HTTP의 차이점. 핵심은 SSL/TLS [ 네트워크 면접질문 6 ] (0) | 2021.12.08 |
---|---|
HTTP1.1과 HTTP2.0 [ 네트워크 면접 질문5 ] (0) | 2021.12.03 |
HTTP 1.0과 HTTP 1.1 [ 네트워크 면접 질문4] (0) | 2021.12.02 |
HTTP 응답 메시지의 상태 코드들 정리. [네트워크 면접 질문2] (0) | 2021.11.30 |
HTTP의 GET과 POST 메서드 비교. [ 네트워크 면접 질문1 ] (0) | 2021.11.29 |