CS/네트워크

[네트워크] soket API의 흐름

연듀 2021. 9. 18. 11:13

 

소켓이란, TCP/UDP IP 환경에서 통신을 위한 통로이다. 

소켓 주소는 IP+Port 번호로 구성되어있다. 

 

데이터 통신은 TCP 통신과 UDP 통신이 있다.

TCP 통신은 연결형으로, 데이터 교환 전에 연결 설정을 하고 교환 후에 연결을 해제한다

UDP 통신은 비연결형으로, 연결이 필요없이 데이터 교환이 이루어진다.

 

TCP 통신에서의 Socket API 흐름을 살펴보겠다.

 

 

연결 설정 

 

 

1. sd = socket()

서버 측에서 소켓을 생성한다.

 

2. bind(sd)

서버가 사용할 IP 주소와 포트 번호를 생성한 소켓에 결합(bind)시킨다.

 

3. listen(sd)

서버는 클라이언트로부터 연결 요청이 수신되는지 주시(listen)한다.

 

4. client_fd = accept(sd, addr, ..)

요청을 기다린다.

 

5. sd = socket()

클라이언트 소켓은 처음 소켓을 생성한다.

 

6. connect(sd, address, ..)

클라이언트가 서버 측에 연결을 요청한다.

 

7. client_fd = accept(sd, addr, ..)

수신되면 요청을 받아들여(accept) 데이터 통신을 위한 소켓을 생성한다.

 

데이터 교환

 

send(sd, buf, size, 0)

recv(sd, buf, size, 0)

서버 소켓에서 연결이 받아들여지면 클라이언트가 서버로 데이터를 송수신한다.

 

send(client_fd, ..)

recv(client_fd, ..)

클라이언트와 마찬가지로 서버도 데이터를 송수신한다.

 

 

연결 해제

 

close(sd)

close(client_fd)

데이터 송수신이 완료되면 소켓을 닫는다.

 

 

 

UDP 절차는 이렇다.

 

1. recvfrom()

데이터를 기다린다.

 

2. sendto()

서버에게 데이터를 보낸다.

 

서버에서 다시 sendto()로 데이터를 보내면 클라이언트에서 recvfrom()으로 데이터를 받고, 다시 sendto()로 보낸다.

 

이렇게 두 과정을 반복하여 데이터를 교환한다. 

 

 

 

소켓 주소는 프로토콜의 종류에 따라 사용하는 주소 체계가 다른데,

AF_INET 주초 체계 외에는 거의 사용하지 않는다.

AF_INET: 다른 호스트에 존재하는 프로세스 사이의 통신을 지원

주소 체계는 32비트 IP주소와 16비트 포트 번호를 기반으로 함.

 

 

 

 

 

 

 

 

 

 

 

참고: https://recipes4dev.tistory.com/153