개발 서적 완독하기/성공과실패를결정하는1%네트워크

성공과 실패를 결정하는 1% 네트워크 - 서버에 접속한다.

코드 살인마 2022. 12. 18. 00:11
728x90

Story 02 서버에 접속한다.

1. 접속의 의미

클라이언트에서 소켓을 만든 직후에는 아직 아무것도 기록되어 있지 않으므로 통신에 대한 아무런 정보가 없다.

 

서버(목적지)의 IP주소나 포트 번호를 프로토콜 스택에 알리는 동작이 필요한데, 이것이 접속 동작의 한 가지 역할이다.

 

클라이언트와는 다르게 서버측은 목적지가 없기 때문에 IP주소나 포트 번호에 대한 정보를 알 수 없다. 그래서 클라이언트에서 자신의 IP 주소,포트 번호를 전달하면 서버측의 프로토콜 스택도 이에 대한 정보를 알 수 있다.

 

접속동작의 첫 번째 동작은 통신 상대와의 사이에 제어 정보를 주고받아 각자의 소켓에 필요한 정보를 기록하여, 데이터 송 수신 가능한 상태로 만든다. 여기서 제어 정보는 데이터 송 수신 동작을 제어하기 위한 정보이며, IP주소, 포트 번호가 대표적인 것 중 하나이다.

 

데이터 송 수신 동작을 실행할 때 송 수신하는 데이터를 일시적으로 저장하는 메모리 영역이 필요한데 이를 버퍼 메모리라 한다. 버퍼 메모리도 접속 동작을 할 때 실행되는데, 이것이 ‘접속’한다는 동작의 의미이다.

 

2. 맨 앞부분에 제어 정보를 기록한 헤더를 배치한다.

앞에서 말한 제어 정보는 아래 표와 같다.

https://user-images.githubusercontent.com/48992412/208247639-ffaf14fa-ab33-44b4-863c-ecefd98f63d9.png

이 제어 정보를 패킷의 맨 앞부분에 배치 하는 곳부터 헤더라고 부른다.

 

클라이언트와 서버는 이 헤더에 필요한 정보를 기록하여 통신 동작을 진행하고 있다.

 

데이터를 저장한 패킷은 IP나 이더넷의 제어 정보, TCP의 제어 정보, 데이터 조각으로 이루어져있고,

제어 정보만 있는 패킷은 이더넷이나 IP의 제어 정보, TCP의 제어 정보로 이루어져 있다.

 

결과적으로 통신 동작에 이용하는 제어 정보는 다음의 두 종류이다.

  • 헤더에 기입되는 정보
  • 소켓(프로토콜 스택의 메모리 영역)에 기록되는 정보

 

3. 접속 동작의 실제

접속 동작은 Socket 라이브러리의 Connect 메서드를 호출하는 곳부터 시작한다.

Connect<디스크립터>, <서버측의 IP 주소와 포트번호>, ...

여기서 서버측의 IP 주소와 포트번호를 쓰면 프로토콜 스택의 TCP 담당 부분(클라이언트)에 전달 되고, 서버의 TCP 담당 부분과 제어 정보를 주고 받는다.

 

먼저 데이터 송 수신 동작의 개시를 나타내는 제어 정보를 기록한 헤더를 만드는 데 가장 중요한 것은 송신처수신처의 포트 번호이다. 이를 통해 송신처가 되는 클라이언트 측의 소켓과 수신처가 되는 서버측의 소켓을 지정할 수 있다. 즉 접속해야 하는 소켓이 어느 것인지 파악하고, 컨트롤 비트인 SYN이라는 비트를 1로 만든다. 아래는 그 이후 상황이다.

 

이렇게 해서 TCP 헤더를 만들면 IP 담당 부분에 건네주어 송신 하도록 의뢰 → IP 담당 부분이 패킷 송신 동작 실행 → 네트워크를 통해 패킷이 서버에 도착 → 서버측의 IP 담당 부분이 받음 → TCP 담당 부분에 건네줌 → TCP 담당 부분이 TCP 헤더 조사이후 기록되어 있는 수신처의 포트 번호에 해당하는 소켓 발견 → 소켓에 필요한 정보 기록 이후 접속 동작 진행 상태 변경 → 서버의 TCP 담당 부분이 응답

 

서버 측도 TCP 헤더(SYN비트, 포트번호) 만들고 응답 할 때 ACK라는 컨트롤 비트 1로 설정한다. 이것은 정상적으로 수신했다는 동작이다.(네트워크 오류로 패킷이 손실될 수 있음) 이후, TCP 헤더를 IP 담당 부분에 전달한 후 반송한다. 그러면 패킷이 클라이언트에 돌아오고 다시 IP → TCP로 전달 되고, TCP 헤더를 조사하여 서버측의 접속 동작이 성공했는지 확인한 이후, 서버의 IP주소, 포트번호 등 소켓에 접속 완료를 나타내는 제어 정보 기록이후, 서버의 패킷을 잘 수신했다는 ACK 비트를 1로 만들고, TCP 헤더를 반송한다. 이러면 접속동작은 끝난다.

 

이로써 소켓은 데이터를 송 수신할 수 있는 상태가 되고 서로의 소켓이 커넥션 되었다고 하고, close를 호출하여 연결을 끊을 때까지 존재한다.