
TCP 연결을 설정할 때 사용하는 방법이다. 이 과정은 TCP가 가상회선을 만들고 제거하는 과정이다.
가상회선을 수립하는 단계 : 클라이언트는 서버에 요청을 전송할 수 있는지, 서버는 클아이언트에게 응답을 전송할 수 있는지 확인하는 과정.
SYN, ACK 패킷을 주고 받으며,
클라이언트 → 서버: SYN, SEQ = 1000 (난수)
SYN패킷에 난수 넣어서 보냄
서버 → 클라이언트: SYN, SEQ = 3000 (난수), ACK = 1001 (클라이언트 순서 번호 + 1)
받은 난수에 1을 더한 ACK패킷과 서버에서 생성한 난수를 SYN에 담아서 보냄
클라이언트 → 서버: ACK, SEQ = 1001 (클라이언트 순서 번호 + 1), ACK = 3001 (서버 순서 번호 + 1)
받은 SYN패킷에는 1을 더해서 응답하고, 받은 ACK패킷은 그대로 보낸다.
++초기 순서 번호(Sequence Number) -> SEQ (여기에 난수를 넣는다.)
++ 왜 난수를 보냄? 초기순서번호 예측가능하면 보안상에 문제가 있을 수 있어서 난수 설정
TCP 연결을 해제할 때 사용하는 방법이다. 이 과정은 양측이 연결 해제를 동기화하고 확인하도록 한다.
FIN패킷(클라이언트 → 서버)
클라이언트가 연결 종료 요청(FIN)을 보냅니다.
ACK 패킷(서버 → 클라이언트)
서버는 클라이언트의 FIN 패킷을 받고, 이를 확인하는 ACK 패킷을 클라이언트로 전송한다.
FIN패킷(서버 → 클라이언트)
서버도 연결을 종료하기 위해 FIN 패킷을 클라이언트로 전송한다.
ACK패킷(클라이언트 → 서버)
클라이언트는 서버의 FIN 패킷을 받고, 이를 확인하는 ACK 패킷을 서버로 전송한다.
이러한 과정을 통해 TCP연결이 안전하게 설정되고 종료된다.
3 way 연결설정 -> 데이터 전송 -> 4 way 연결해제
데이터 전송 중에는 TCP가 신뢰성을 보장하기 위해 데이터를 패킷으로 나누고, 손실 시 재전송하거나 흐름 제어를 수행한다.
tcp가 어떻게 양방향 통신으로 신뢰성을 가지고 있는지 알 수 있었다.
내 경험으로는 이 tcp handshake개념을 직접적으로 해결해야 되는 상황은 거의 없었지만
네트워크관련해서 추후에 마주할 문제에 대해 예방할 수 있는 여러가지 추가 개념들이 보여서 기본기 측면에서 알아둬야될 내용인 것 같다
●첫번째로 현재 다루는 api 에러는대부분 tcp문제가 아닌 경우가 대부분이지만 찾아보니 실시간 서비스에서 tcp신뢰성(재전송, 흐름 제어)를 활용해 문제가 발생하면 tcp단계 까지 진단할 가능성이 있다는 점
●두번째로 네트워크 엔지니어와의 협업 가능성
결론적으로 실무에서 다루는 일이 많지는 않을 수 있지만 네트워크 문제를 다루거나 협업할 때 기본기로써 역할을 할 것 같다.