Finn의 개발블로그
2-2. 서버에 접속한다 본문
1. 접속의 의미
- socket을 호출하여 소켓을 만드는 동작만으로 프로토콜 스택에는 아무 것도 전달되지 않습니다.
- 클라이언트에서 서버측으로 자기의 IP주소와 포트번호를 전달합니다.
- 접속 동작의 첫 번째 동작은 통신 상대와의 사이에 제어 정보를 주고받아 소켓에 필요한 정보를 기록하고 데이터 송 수신이 가능한 상태로 만드는 것 입니다.
- 접속 동작에서 주고받는 제어 정보는 통신의 규칙이 정해져 이씅므로 규칙에 따라 접속 동작을 실행하면 필요한 정보가 전달되고 데이터를 송 수신할 수 있는 상태가 됩니다.
- 데이터 송 수신 동작을 실행할 때는 송 수신 하는 데이터를 일시적으로 저장하는 메모리 영역을 버퍼 메모리 라고 합니다.
- 버퍼 메모리의 확보도 접속 동작을 할 떄 실행됩니다.
2. 맨 앞부분에 제어 정보를 기록한 헤더를 배치한다.
- 제어 정보 중 하나는 클라이언트와 서버가 서로 연락을 절충하기 위해 주고 받는 제어 정보입니다.
- 접속 동작뿐만 아니라 데이터를 송 수신하는 동작이나 연결을 끊는 동작도 포함하여 통신 동작 전체에서 어떤 정보가 필요한지 검토하여 내용을 TCP 프로토콜의 사양으로 규정하고 있습니다.
- 이 제어 정보를 패킷의 맨 앞부분에 배치하지 곳부터 헤더라고 부릅니다.
- 프로토콜 스택의 동작을 추적할 떄 수시로 각 항목의 의미 등을 설명하므로 여기에서는 일단 헤더의 형태로 제어 정보를 주고받습니다.
- 제어 정보는 소켓에 기록하여 프로토콜 스택의 동작을 제어하기 위한 정보가 더 있습니다.
- 애플리케이션에서 통지된 정보, 통신 상대로부터 받은 정보, 송 수싱 동작의 진행 상황 등, 프로토콜 스택은 하나하나 차례로 참조하면서 움직입니다.
- 규칙에 따라 헤더에 제어 정보를 기록하여 대화하면, 그것으로 클라이언트와 서버가 서로 연락을 취하기 때문에 서로 다른 OS 끼리 통신하는데 문제가 없는 것 입니다.
- 소켓에 제어 정보 중에서 중요한 것은 어느 OS 프로토콜 스택에도 공통입니다.
3. 접속 동작의 실제
- Socket 라이브러리 connect를 호출
- connect(<디스크립터>, <서버측의 IP 주소와 포트 번호>, ....) 여기에 서버측의 IP 주소와 포트 번호를 쓰면 명령이 프로토콜 스택의 TCP 담당 부분에 전달됩니다. 그 이후 TCP 담당 부분은 IP 주소로 표시된 서버의 TCP 담당 부분과의 사이에 제어 정보를 주고받습니다.
- TCP 헤더에서 중요한 것은 송싱처와 수신처의 포트 번호 입니다. 이를 통해 송신처가 되는 클라이언트측의 소켓과 수신처가 되는 서버측의 소켓을 지정할 수 있습니다. 접속해야 하는 소켓이 어느 것인지 확실히 하고 컨트롤 비트 SYN 이라는 비트를 1로 만듭니다.
- TCP 헤더를 만들고 이것을 IP 담당 부분에 전달 송신하도록 의뢰합니다.
- IP 담당 부분이 패킷 송신 동작을 실행하고 패킷이 서버에 도착 하면 서버측의 IP 담당 부분이 TCP 담당 부분에 건네줍니다.
- TCP 담당 부분이 TCP 헤더를 조사하여 기록되어 있는 수신처 포트 번호에 해당하는 소켓을 찾아냅니다.
- TCP 헤더의 수신처 포트 번호와 같은 번호가 기록된 소켓이 발견되면 여기에 필요한 정보를 기록하고 접속 동작이 진행중이라는 상태가 됩니다. 그 이후 서버의 TCP 담당 부분은 응답을 돌려보냅니다.
- 서버측은 송신처와 수신처의 포트 번호, SYN 비트 등을 설정한 TCP 헤더를 만들고 ACK라는 컨트롤 비트도 1로 만듭니다. 이유는 패킷을 받은 걷을 알리기 위한 동작입니다.
- 네트워크에는 오류가 있을 수 있으므로 패킷이 없이지는 경우에는 패킷이 도착한 것을 확인하는 동작이 진행됩니다.
- 패킷이 도착한 것을 확인하기 위해 ACK 비트를 1로 만드는 것입니다.
- TCP 헤더를 IP 담당 부분에 건네주어 클라이언트에 반송하도록 의뢰합니다.
- 패킷이 클라이언트로 돌아오고 IP 부분을 경유하여 TCP 담당 부분에 도착합니다. 이떄 SYN이 1이면 접속 성공이므로 소켓에 서버의 IP 나 포트 번호 등과 함계 소켓에 접속 완료를 나타내는 제어 정보를 기록합니다.
- 먼저 서버가 응답을 돌려보낼 떄 ACK 비트로 1로 만들었는데, 클라이언트 측에서도 패킷이 도착한 것을 서버에 알리기 위해 ACK 1비트를 1로 만든 TCP 헤더를 반송합니다.
- 데이터를 주고 받게 만들어주는 파이프와 같은 것을 커넥션 이라고 합니다.
- cloase를 호출하여 연결을 끊을 때까지 계속 존재합니다.