상위 문서: Application Layer
개요
Socket 프로그래밍(Socket programming)의 목표는 socket을 사용하여 network communication을 사용하는 client/server 애플리케이션을 만드는 것이다. 이때 socket은 사용하는 transport service의 종류, UDP와 TCP에 따라 다르게 구현된다. UDP는 client와 server 사이에 'connection'(handshaking)이 존재하지 않는다. 또한 UDP를 통해서 전송되는 데이터는 out-of-order되거나, 누락될 수도 있다. 하지만 TCP는 handshaking을 통해서 클라이언트와 서버 사이의 'connection'을 구성한 다음, 서버와 클라이언트 사이의 통신이 진행된다. 이를 통해서 reliable data transfer를 가능케 한다.
이때 UDP와 TCP의 datagram의 헤더 파일에는 모두 목적지의 IP 주소와 port 번호가 포함된다. 하지만 UDP는 연결 설정 과정이 없기 때문에, 매번 데이터를 전송할 때마다 프로그래머는 상대방의 주소(IP 주소와 포트 번호)를 명시해야 한다. 하지만 TCP는 최초 연결 설정 시 이미 양쪽의 IP 주소와 포트 번호를 교환하고 기록해두고, 이후 데이터를 전송할 때 운영체제와 프로토콜 스택이 이 주소 정보를 자동으로 관리한다. 따라서 개발자는 데이터를 보낼 때마다 매번 IP 주소와 포트 번호를 명시할 필요가 없다.
Socket programming with UDP
파일:The client-server application using UDP.png
위는 UDP에 의해 구현된 클라이언트와 서버가 데이터를 주고 받는 socket 프로그래밍의 예시를 보여준다.
- Server 측
- 서버는 특정 포트 번호(port=x)를 사용하여 UDP 소켓을 생성한다.
- serverSocket = socket(AF_INET, SOCK_DGRAM) 명령어로 수행된다.[1]
- 서버는 클라이언트가 보낸 UDP 세그먼트(데이터그램)를 기다렸다가 읽는다.
- 서버는 클라이언트로부터 받은 데이터에 대한 응답(reply)을 서버의 소켓을 통해 다시 전송한다.
- 서버는 특정 포트 번호(port=x)를 사용하여 UDP 소켓을 생성한다.
- Client 측
- 클라이언트는 UDP 소켓을 생성한다.
- clientSocket = socket(AF_INET, SOCK_DGRAM) 명령어로 수행된다.
- 클라이언트는 서버의 IP 주소와 포트 번호를 목적지로 하는 데이터그램(datagram)을 생성하고 이를 serverSocket에게 전송한다.
- 서버가 응답을 보내면, 클라이언트는 clientSocket을 통해 그 응답을 읽고 해당 socket을 닫고 종료한다.
- 클라이언트는 UDP 소켓을 생성한다.
Socket programming with TCP
파일:The client-server application using TCP.png
위는 TCP에 의해 구현된 클라이언트와 서버가 데이터를 주고 받는 socket 프로그래밍의 예시를 보여준다.
- Server 측
- 서버는 클라이언트의 요청(request)을 받기 위해 특정 포트 번호(port=x)를 사용하여 소켓을 생성한다.
- serverSocket = socket() 명령어로 수행된다.
- 서버는 클라이언트로부터의 TCP 연결 요청을 기다린다.
- connectionSocket = serverSocket.accept() 명령어를 통해 TCP 연결이 설정된다.[2]
- 서버는 연결된 클라이언트로부터 전송된 데이터를 connectionSocket을 통해 읽는다.
- 서버는 클라이언트로부터 받은 요청에 대해 처리 후, 응답(reply)을 clientSocket으로 전송한다.
- reply 전송이 끝나면 서버는 connectionSocket을 닫고 이를 종료한다.
- 서버는 클라이언트의 요청(request)을 받기 위해 특정 포트 번호(port=x)를 사용하여 소켓을 생성한다.
- Client 측
- 클라이언트는 서버 IP 주소와 포트 번호(port=x)를 사용하여 서버와의 TCP 연결을 설정하기 위한 소켓을 생성한다.
- clientSocket = socket() 명령어로 수행된다.
- 클라이언트는 clientSocket을 통해 서버에 요청(request)을 보낸다.
- 서버로부터 전송된 응답(reply)을 클라이언트의 clientSocket을 통해 읽는다.
- 클라이언트는 응답을 받은 후, clientSocket을 닫고 종료한다.
- 클라이언트는 서버 IP 주소와 포트 번호(port=x)를 사용하여 서버와의 TCP 연결을 설정하기 위한 소켓을 생성한다.