본문 바로가기
COMPUTER SCIENCE/Network

[Network] Application Layer - Socket Programming

by 민트맛녹차 2022. 11. 28.

Socket

일반적인 network application 은 client prorgram 과 server program 의 쌍으로 구성된다. client program 과 server program 이 실행되면, client process 와 server process 가 생성되고 process 간 communication 을 위해 socket 을 사용한다.

socket 은 application layer 와 transport layer 사이에 존재한다. 프로그래머는 TCP/UDP 헤더를 어떻게 만들어야 하는지, 구조가 어떻게 되는지 등의 고민 없이 socket API 를 사용하여 network application 을 만들 수 있다.

 

Socket Programming with UDP

다음은 UDP 의 몇 가지 특징들이다.

  • UDP 는 connectionless protocol 이므로 데이터 전송 전에 handshanking 이 없다.
  • UDP 는 전달된 데이터가 손실되거나 변조될 수 있어 unreliable 하다. 

따라서 application 을 개발할 때 UDP 는 unreliable transfer 를 제공한다는 것을 알아야 한다.

위의 그림은 UDP 를 사용한 application 의 간단한 예이다.

client 측의 동작은 다음과 같다.

  1. client 는 UDP socket 을 생성한다. UDP socket 생성 시 port number 는 사용하지 않는다. (socket)
  2. client 는 server 에 보낼 data 를 생성하고, socket 을 통해 destination address(server's IP address & port number) 과 함께 data 를 보낸다. (sendto)
  3. socket 을 통해 server 로 부터 응답을 받는다. 응답에는 packet 의 data 와 server address(server's IP address and port number) 가 있다. (recvfrom)
  4. socket 을 close 한다. (close)

server 측의 동작은 다음과 같다.

  1. server 는 UDP socket 을 생성한다. (socket)
  2. server 는 입력한 port number 로 socket 을 bind 한다. (bind)
  3. socket 을 통해 전달된 packet 의 data 와 client's address 를 얻는다. (recvfrom) 
  4. server 는 client 에 보낼 data 를 생성하고, socket 을 통해 client's address 와 함께 data 를 보낸다. (sendto)

UDP client 는 socket - sendto - recvfrom - close 순으로 동작하고, UDP server 는 socket - bind - recvfrom - sendto 순으로 동작한다. sendto 와 recvfrom 의 순서는 application 마다 달라질 수 있다.

Socket Programming with TCP

TCP 는 connection-oriented protocol 이므로 데이터 전송 전에 3-way handshaking 을 통해 TCP connection 을 생성한다.

server 가 먼저 socket 을 생성하면, client 는 TCP socket 을 만들어 server TCP 와 connection 을 시도한다.  client 와 연결되면 server TCP 는 새로운 socket 을 생성해 client 와 communicate 한다. 이때 handshaking 을 하던 socket 은 Welcoming socket, client 와 communicate 하기위해 새로 생성된 socket 을 Connection socket 이라고 한다.

application 을 개발할 때 TCP 는 reliable, in-order transfer 를 제공한다는 것을 알아야 한다.

위의 그림은 TCP 를 사용한 application 의 간단한 예이다.

client 측의 동작은 다음과 같다.

  1. client 는 TCP socket 을 생성한다. (socket)
  2. client 는 server's IP address 와 port number 를 사용해 server 에 TCP connection 요청을 보낸다. (connect)
  3. connection 이 생성되면 client 는 server 에 보낼 data 를 생성해 connection 이 생긴 socket 을 통해 보낸다. (send)
  4. socket 을 통해 server 가 전달한 data 를 받는다. (recv)
  5. socket 을 close 하여 TCP connection 을 close 한다. (close)

server 측의 동작은 다음과 같다.

  1. server 는 TCP welcoming socket 을 생성한다. (socket)
  2. server 는 입력한 port number 로 socket 을 bind 한다. (bind)
  3. server 는 client 의 TCP connection request 를 기다린다. maximum number of queued connection 을 설정할 수 있다.(listen)
  4. server 는 특정 client 에 대한 connection socket 을 생성한다. handshaking 이 성공하면 client socket 과 connection socket 사이에 TCP connection 이 생성된다.  (accept)
  5. connection socket 을 통해 client 가 전달한 data 를 받는다. (recv)
  6. client 에 보낼 data 를 생성해 socket 을 통해 보낸다. (send) 
  7. connection socket 을 close 한다. (close) 

TCP client 는 socket - connect - send - recv - close 순으로 동작하고, TCP server 는 socket - bind - listen - accept - recv - send - close 순으로 동작한다. send recv 의 순서는 application 마다 달라질 수 있다.

 

 

참조
Computer Networking _ A Top Down Approach, 7th, converted
https://web.archive.org/web/20080422072552/http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/socket_layer

 

댓글