4.TCP 기반 서버 클라이언트

 

#.TCP/IP 프로토콜 스택

 

#.LINK 계층

이 계층은 물리적인 영역의 표준화에 대한 결과이다. 이는 가장 기본이 되는 영역으로 LAN, WAN 과 같은 네트워크 표준과 관련된 프로토콜을 정의 하는 영역이다.

 

#.IP계층

목적지로 데이터를 전송하기 위해서 중간에 어떤 경로를 거쳐갈 것인가? 이문제를 해결하는 것이 IP 계층이고, 이 계층에서 사용하는 프로토콜이 IP 이다. IP 자체는 비 연결지향적이며 신뢰할 수 없는 프로토콜이다. 즉, 오류발생에 대한 대비가 되어 있지 않은 프로토콜이 IP이다.

 

#.TCP/IP 계층

데이터의 전송을 위한 경로의 검색을 IP 계층에서 해결해주니, 그 경로를 기준으로 데이터를 전송만 하면 된다. TCP와 UDP계층은 이렇듯 IP 계층에서 알려준 경로 정보를 바탕으로 데이터의 실제 송수신을 담당한다. 또한 TCP는 통신할때 확인 절차를 거쳐 신뢰성 없는 IP에 신뢰성을 부여한 프로토콜이라 할 수 있다.

 

#.어플리케이션 계층

여기까지가 소켓을 생성하면 데이터 송수신 과정에서 자동으로 처리되는 것들이다.  데이터의 전송경로를 확인하는 과정, 데이터 수신에 대한 응답의 과정이 소켓이라는 것 하나에 감춰저 있기 때문이다. 최종적으로 소켓이라는 도구가 주어졌고, 우리는 이 도구를 이용해서 무언가를 만들면 된다. 이 과정에서 프로그램의 성격에 따라 클라이언트와 서버간의 데이터 송수신에 대한 약속들이 정해지기 마련인데, 이를 가리켜 어플리케이션 프로토콜이라고 한다. 그리고 대부분의 네트워크 프로그래밍은 어플리케이션 프로토콜의 설계 및 구현이 상당부분을 차지한다.

 

#.TCP 서버의 함수 호출 순서

 

# TCP 서버에서의 기본적인 함수호출 순서

1. socket : 소켓생성(아직은 버소켓이 아니다.)
2. bind : 소켓에주소 할당한다.(IP, PORT)
3. listen : 연결요청 대기상태가 된다.(1번에서 만든 소켓이 서버소켓(문지기역할)이 되며,

클라이언트의 연결요청을 대기시키는 연결요청 대기 큐가 생성됨)

(connect 호출 - 일반적)

4. accept : 연결허용(이때, 클라이언트 소켓과의 송수신을 위한 소켓이 "추가로 생성"됨, 클라이언트 소켓과 일대일 대응)
(connect 호출 - 일반적이진 않으나, 이때까지 accept는 블로킹됨)
5. read / write : 데이터 송수신
6. close : 연결종료

 

 

#. 연결요청 대기상태로의 진입

- listen 함수가 호출되어야만 클라이언트는 연결요청을 위해 connect 함수를 호출 가능하다

(이전에 호출되면 오류 발생한다.)
- listen 함수 호출을 통해 서버소켓(문지기 역할)이 생성되고, "연결요청 대기 큐"가 생성되면 비로소 "연결요청 대기상태"가 되는 것
- 연결요청 대기큐의 크기는 어디까지나 서버의 성격에 따라 다르기 때문에 실험적 결과에 의존해서 결정하게 된다.

 

 

 

# 클라이언트의 연결요청 수락

- listen 함수호출 이후 클라이언트의 연결요청이 들어오면, 들어온 순서대로 연결요청을 수락해야 함
- 연결요청을 수락하면 데이터 송수신이 가능해지므로, 이를 위한 소켓이 생성되어야 함

("서버소켓"말고 클라이언트 소켓과 데이터 송수신을 위한 일대일로 연결된 소켓이 추가로 생성되어야 함)
- accept 함수 호출로 이 소켓이 만들어지고, 이 소켓이 자동으로 클라이언트 소켓과 연결됨
- "연결요청 대기큐"에서 대기중인 클라이언트의 연결요청을 수락하는 함수가 바로 "accept"
- 만약 accept 함수가 호출되었을 때 연결요청 대기큐가 비어있다면, 대기큐에 요청이 들어올때까지

accept 함수는 반환하지 않음(블로킹)

 

# connect 함수가 호출되면 다음 둘 중 한가지 상황이 되어야 함수가 반환된다(함수호출이 완료된다)
- 서버에 의해 연결요청이 "접수"되었다. : 서버의 accept 함수호출이 아닌, 서버의 연결요청 대기큐에 등록된 것을 의미한다.
- 네트워크 단절 등 오류상황이 발상해서 연결요청이 중단되었다.

- 그러므로, connect 함수가 반환했더라도 연결요청 대기큐에 들어가있거나, 오류상황이 발생했을 수 있으므로 당장에 서비스가 이뤄지지 않을수도 있다.

 

 

# 클라이언트 소켓의 주소정보는 언제 할당 받나? 

 

- 서버소켓

1)bind 함수를 통해 명시적으로 주소정보 할당을 한다.

 

- 클라이언트 소켓
1) connect 함수가 호출될 때
2) 운영체제에서(커널)
3) IP는 해당 컴퓨터(호스트)의 IP로, PORT번호는 임의로 할당

(서버소켓과 달리 bind 함수 호출이 아니라, connect 함수호출시 자동으로 소켓에 IP와 PORT가 할당된다.)

 

#.예제 시나리오

- 서버는 한 순간에 하나의 클라이언트와 연결되어 에코 서비스를 제공한다.

- 서버는 총 다섯 개의 클라이언트에게 순차적으로 서비스를 제공하고 종료한다.

- 클라이언트는 프로그램 사용자로부터 문자열 데이터를 입력받아서 서버에 전송한다.

- 서버는 전송 받은 문자열 데이터를 클라이언트에게 재전송한다.

- 서버와 클라이언트간의 문자열 에코는 클라이언트가 q를 입력할 때까지 계속한다.

 

 

#.서버예제

 

#.클라이언트 예제

 

결과

 

 

 

 

[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어