소켓 이란
-
소켓2023.10.23
소켓
소켓
소켓이란 각 프로세스간 전송(transport) 계층과 애플리케이션 계층을 연결하는 인터페이스이다.
즉 소켓에 읽기, 쓰기 를 통해 서로다른 네트워크 상의 두 컴퓨터는 통신한다. (서로다른 종단 시스템 간의 프로세스 통신)
전송 계층은 우리가 앞서 배웠던것처럼 TCP, UDP 두가지 방식이 있다. 즉 소켓을 사용하는 방법 또한 TCP, UDP 두가지 방식이 있다.
UDP 방식

UDP 통신을 할땐 위와 같은 과정을 거친다. UDP 는 비연결 통신 이므로 따로 연결을 설정하거나 종료하는 과정이 없다.
즉 클라이언트 측에서 메세지를 보낼때마다 어느 서버로 보내는지 명시를 해야하며, 서버측 또한 어느 클라이언트로 부터 데이터를 받는지 확인을 해야한다. 따라서 클라이언트 측의 메세지를 보내는 메서드의 이름이 sendto()
이다.

위와같이 UDP 프로토콜을 사용함에도, connect()
함수를 사용할수 있다. 하지만 이 connect()
메서드가 TCP 방식에서 사용할 connect()
함수와는 같지 않으며, 단순히 클라이언트 측의 소켓에 대상 주소를 지정 해주는 것으로 이해해야한다.
위처럼 사용하면 클라이언트 측에서 메세지를 보낼때 마다 IP 주소를 명시하지 않아도 된다(따라서 클라이언트에서 메세지를 보낼때 사용하는 메서드명이 sendto()
가 아닌 send()
이다.
TCP 방식

TCP를 사용하여 통신을 할땐 위와같은 과정을 거친다.
TCP 서버
- bind() : 소켓을 특정 IP 주소와 포트 번호에 바인딩한다. IP 주소는 대개 서버가 실행 중인 시스템의 주소이며. 포트번호는 HTTP를 통해 요청을 받는다면 80번 포트로 바인딩 할것이다.
- listen(): 이 함수는 소켓이 클라이언트로부터 들어오는 연결을 수락할 준비가 되었음을 운영체제에 알린다.
- accept(): 클라이언트의 연결 요청을 대기한다. 연결 요청이 들어오면,
accept()
는 새로운 소켓을 반환한다. 이 새로운 소켓을 사용하여 클라이언트와 통신한다. - recv() : 클라이언트 쪽에서 전송하는 데이터를 수신한다.
- send(): 요청에 대한 동작을 처리한후, 클라이언트 쪽에 데이터를 전송한다.
위 과정이 끝난다면 서버는 다시 accept()
함수를 실행한다. 즉 다른 클라이언트의 connect()
요청이 올때까지 기다린다.
📌TCP 클라이언트는 bind()
부분이 없다. 그이유는 서버측은 어떤 포트를 사용하는지 정해져야 하지만 클라이언트는 어떤 포트가 사용되는지가 중요하지 않다. (클라이언트는 OS 가 랜덤으로 포트를 지정한다.)

또한 listen()
때 사용하는 소켓과 accept()
때 사용하는 소켓이 다르다. listen()
에 사용되는 소켓은 환영 소켓(listening socket) 이며, accept()
에 사용되는 소켓은 연결 소켓(connection socket)이다.
즉 서버에 연결된 클라이언트가 100개라면, 환영 소켓 1개(3-way-hand-shake) + 각 클라리언트에 연결된 연결소켓 100개 총 101개의 소켓이 서버측에 존재하게 된다.
TCP 클라이언트
- connect() : 서버측에 연결을 시도한다.
- send(): 서버측에 데이터를 전송한다.
- recv() : 서버측으로 부터 온 데이터를 수신한다.
Python 으로 TCP 서버 및 클라이언트 구현
TCPClient.py

위 코드는 TCP 연결을할때 클라이언트 측의 코드이다.
serverPort= 12000
: 위 코드는 서버의 12000 포트로 연결을 한다.clientSocket = socket(AF_INET, SOCK_STREAM)
: 클라이언트측의 소켓을 생성한다. 이때 첫번째 파라미터는IPv4
를 사용함을 의미하며,SOCK_STREAM
은 UDP 소켓이 아닌 TCP 소켓임을 의미한다.clientSocket.connect((serverName, serverPort))
: TCP 연결을 할땐, 데이터를 보내기전 TCP 연결이 먼저 클아이언트와 서버 사이에 설정이 되어야 한다..connect()
메서드는 연결할 서버의 이름 및 포트를 파라미터로 받으며, 해당 코드가 실행된 후 3-way-handshake 가 수행되고 클라이언트 서버간 TCP연결이 설정된다.
UDP 는 연결이 없는 프로토콜이다. 따라서 메세지 (패킷) 을 보낼때마다 IP 와 포트를 지정해야 하지만, TCP 는 연결 지향적 프로토콜이다.
즉 최초 클라이언트와 서버 사이에 3-way-handshake 를 통해 연결을 설정하면, 해당 연결에 대한 소켓은 특정 IP 포트와 연결된다. 따라서 UDP 와 다르게 데이터를 전송할 때 마다 IP 와 포트를 다시 지정할 필요가 없다.
TCPServer.py

위 코드는 TCP 연결을 할때 서버측의 코드이다.
serverSocket = socket(AF_INET, SOCK_STREAM)
: 서버측 또한 TCP 연결을 위해SOCK_STREAM
을 사용하는 소켓을 만든다. 이때 생성되는serverSocket
은 환영 소켓 이다.connectionSocket , addr = serverSocket.accept()
:accept()
메서드를 통해 특정 클라이언트의 연결요청이 오면, 새로운 소켓 (연결소켓connectionSocket
) 을 반환한다. 그 뒤 클아이언트와 서버는 핸드 셰이킹을 완료한후 클라이언트의clientSocket
과 서버의connectionSocket
간의 TCP 연결을 생성한다.
'네트워크' 카테고리의 다른 글
RDT(Reliable Data Transfer) (1) | 2023.11.21 |
---|---|
Multiplexing, deMultiplexing (0) | 2023.10.25 |
DNS (0) | 2023.10.19 |
HTTP1/HTTP2/HTTP3 (0) | 2023.10.19 |
HTTP) TCP 및 3-way handshake (1) | 2023.05.09 |