밍경송의 E.B

[네트워크] Socket, Socket programming (스트림 소켓, 데이터그램 소켓) 본문

CSE/정보통신공학

[네트워크] Socket, Socket programming (스트림 소켓, 데이터그램 소켓)

m_gyxxmi 2023. 4. 19. 21:55

Socket이란?

소켓은 프로세스가 네트워크 세계로 데이터를 내보내거나 받기 위한 실제적인 창구의 역할을 하는 통신의 종점입니다.

연결 지향적이거나 비연결이거나 관계없이 클라이언트와 서버 프로세스 간의 통신을 가능하게 합니다.

TCP와 UDP 헤더에는 발신지/목적지 포트 필드가 들어있고, IPv4와 IPv6 헤더에는 발신지/목적지 주소가 들어있다는 걸 저저번 포스팅에서 다루었는데요. (TCP header가 먼저 들어가니까 맨 나중에 까일 거고 그러니까 거기에 포트가 있어야..)

--> 이들은 호스트 시스템을 식별해주는 역할을 합니다.

      Identifier includes both 1) IP address and 2) port numbers associated with process on host.

 

*소켓은 (프로토콜, 로컬 주소(IP 주소), 로컬 프로세스(포트 번호))로 정의 됩니다.

-IP 주소: 전 세계 컴퓨터에 부여된 고유의 식별 주소

-포트: 네트워크 상의 통신을 위해서 호스트 내부적으로 프로세스가 할당받아야 하는 고유한 숫자

          (같은 컴퓨터 내에서 프로그램을 식별하는 번호)

Ex) to send HTTP message to gaia.cs.umass.edu web server : IP address: 128.119.245.12 , Port number: 80(HTTP)

 

 

*또, 소켓은 역할에 따라 Server socketClient socket으로 구분되는데요.

- Server socket(서버 소켓): 클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하게 함.

- Client socket(클라이언트 소켓): 실제로 송수신이 일어나는 소켓

 


 

소켓의 종류에 대해 다루기 위해 Transport protocol service에 대해 간략하게 정리해보겠습니다.

Transport service requirements

*APP은 어떤 Transport services를 필요로 하는가?

- Data integrity: some apps require 100% reliable data transfer (loss 없이 data가 잘 도착할 수 있는지)

- Timing: some apps require low delay to be "effective" (delay 내에 잘 도착하는지)
- Throughput: some apps require minimum amount of throughput to be "effective",

   other apps(elastic) make use of whatever throughput they get (주어진 시간 내에 user을 몇 명 처리하는지)

- Security: encryption, data integrity ..

 

 


 

Internet transport protocol services

TCP service ---- 스트림 소켓☆ UDP service ------ 데이터그램 소켓★
- reliable transport (연결 지향성)

- flow control (흐름 제어)

- congestion control: network overload ->throttle(조절판) send

- NOT provide: timing, minimum throughput guarantee, security 
- connection-oriented : setup required between client & server
- unreliable data transfer (비연결형 소켓)

- NOT provide: reliability, flow control, congestion control, congestion control, timing, throughput guarantee, security, connection setup

- 제대로 전달과 순서에 맞는 수신 보장 x

- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용 ex)전화

 

*Application에 따른 transport protocol 예시

ㄴ파일이 손실되면 안 되는 경우는 대부분 TCP를 사용하고, 오디오나 비디오의 경우 간혹 UDP를 사용하기도 합니다.


cf. Securing TCP , TLS(Transport Layer Security)

: 개인 정보 보호 및 안전한 전송을 위해 이메일을 암호화하는 표준 인터넷 프로토콜 (provides encrypted TCP connection)

-->Gmail은 이메일을 전송할 때 항상 TLS에 연결하여 사용함 -> 암호화! !

**Vanila(순수한 상태의) TCP & UDP  소켓은 암호화되지 않음! 

 


 

 자 이제, TCP와 UDP 연결에 따른 두 종류의 소켓 프로그래밍 과정에 대해 자세히 알아봅시다.

 교재에 나와있는 예시를 그대로 사용하겠습니다.

-------------------

 Application Ex(과정소개)

1. client reads a line of characters (data) from its keyboard and sends data to server

2. server receives the data and converts characters to uppercase(대문자로)

3. server sends modified data to client

4. client receives modified and displays line on its screen

--------------------

 

먼저, 스트림 통신(TCP)의 과정에 대해 알아보겠습니다.

-소켓 프로그래밍에서 호출된 함수들에 대해 알아봅시다. 

 

socket(): 소켓의 초기화(설정) 

    parameter- 1) domain: 생성할 소켓의 프로토콜 계열 (AF_UNIX: 동일 시스템 내에 있는 프로세스 사이 통신, AF_INET: IPv4 , AF_INET6: IPv6)

                     - 2) type: 소켓의 유형(스트림, 데이터그램, 원초적(raw))

                     - 3) protocol: TCP(SOCK_STREAM) 또는 UDP(SOCK_DGRAM)를 가리킴

bind(): 소켓과 포트 주소를 결합함 

   parameter- sockfd: 포트 주소에 연결될 소켓, localaddress: 소켓 주소, addresslength: 소켓 주소의 길이

listen(): 들어오는 연결상에서 소켓의 청취 (*청취와 연결은 다른 것!)

   parameter- soxckfd: 청취하는 응용의 소켓, queuesize: 대기 가능한 요청의 수

accept(): 들어오는 연결 요청을 허용

   parameter- sockfd: 허용할 연결의 소켓, remoteaddress: 연결을 개시한 상대방 소켓의 주소, addresslength: 소켓 주소의 길이

connect(): 서버로 가는 연결 수립

   parameter- sockfd: 개설할 소켓, remoteaddress: 연결을 개시할 상대방 소켓의 주소, addresslength: 소켓 주소의 길이

send(), recv(), read(), write(): 스트림 소켓상에서 데이터 송수신 (송신.수신 또는 읽기.쓰기)

    parameter- sockfd: 데이터를 읽거나 내 보낼 소켓, data: 보낼 데이터 또는 읽을 데이터를 놓아 둘 버퍼, datalength: 읽거나 내 보낼 데이터의 길이

sendto(), recvfrom(): 데이터그램 소켓상에서 데이터 송수신 

    parameter- sockfd: 데이터를 송수신할 소켓, data: 내 보낼 데이터 또는 읽을 데이터를 놓아 둘 버퍼, datalength: 읽거나 내 보낼 데이터의 길이

close(): 소켓 해제 

    parameter- sockfd: 해제될 소켓

 


 

 

Client/Server socket interaction : TCP

전체적인 구조도

 

*Server랑 Client의 API를 각각 구현된 코드로 나눠서 보겠습니다.

 

1) TCP Server

..타자로 치기 너무 길어서 이렇게 올림..

다른 건 다 이해가 되는데, 저는 listen()이랑 accept() API 부분이 너무 헷갈렸습니다. 근데, 이해하고나서 보니까 이름에만 잘 주목하면 됨.

 

일단, listen() API는 client의 연결 요청이 있는지 확인하며 대기하는 것으로, client의 연결 요청이 수신되더라도 그(요청)에 대한 정보는! 알 수 없다는 점에 주목해야 합니다. (이름 그대로 그냥 listen이지 뭔가 수립하는 친구는 아니에요..)

-> Client의 요청에 대한 정보는 생성된 대기 Queue에 들어가서 쌓이게 되고, 여기서 이 정보를 꺼내와 연결을 완료하기 위해서 accept() API의 호출이 필요한 겁니다. 

 

 

*Server가 생성하는 2개의 socket

Server socket: 클라이언트의 연결 요청 수신 - bind() 및 listen()을 통해 소켓에 포트 번호를 바인딩하고 요청 대기 큐를 생성하여 클라이언트의 요청을 대기함.

Connection socket: 데이터 송수신을 위한 새로운 소켓/ Client socket과 connection이 만들어지는 socket - accept()에서 만들어지고, 서버 소켓의 대기 큐에 쌓여있는 첫 번째 연결 요청을 매핑시킴.

--> close()의 대상이 하나가 아니겠다는 확신... (두 소켓 다 관리해야 함!)


2) TCP Client

다른 API는 Server 파트와 동일하니 생략하고, connect() API에 대한 이야기만 하겠습니다.

connect() APIIP주소와 포트 번호로 식별되는 대상(target)으로 연결 요청을 보냅니다. 이 요청에 대한 결과(성공, 거절, 시간 초과 등)가 결정되기 전까지 connect()의 실행은 끝나지 않고, Block되어있습니다. -> 호출에 성공하면, 코드와 같이 send() / recv() API를 통해 데이터를 주고 받을 수 있습니다.

 

 


 

이번에는 데이터그램(UDP)의 통신 과정에 대해 알아보겠습니다.

Client/Server socket interaction : UDP

 

 

 

UDP 통신과정은 TCP보다 훨씬 간단한 구조로 이루어지니 바로 코드 해석으로 넘어가도록 하겠습니다.

 

1) UDP Server

1) UDP Client

굳이 TCP랑 다른 점을 찾자면.. send() 대신 sendto() , recv() 대신 recvfrom() API를 쓴다는 것.. 정도

UDP는 비연결형 프로토콜이기 때문에 연결 요청/수립의 과정 없이 데이터그램을 보내고 받는 과정만 있으면 됩니다.

 

 

 


이상으로 socket, socket programming에 대한 포스팅을 마치겠습니다.....................

 

 

자료참고:

https://recipes4dev.tistory.com/153 ---강츄... 구세주