한양대학교 이석복 교수님의 2017년 2학기 컴퓨터 네트워크 강의를 듣고 정리한 글입니다.
목차
- DNS 가 UDP 기반으로 동작하는 이유
- 소켓 (Socket)
- 소켓의 종류 (Two essential types of sockets)
- Socket Functions(TCP case)
DNS 가 UDP 기반으로 동작하는 이유
HTTP, DNS 둘 다 Application Layer Protocol 로서 Transport Layer Protocol 인 TCP 와 UDP 를 사용한다. HTTP 가 TCP 기반이라는 것은 잘 알려져 있다. 그렇다면 DNS 는 어떤 프로토콜을 사용할까 ? 직관적으로 생각하면 데이터가 유실되면 안 되기 때문에 TCP 를 사용할 것만 같다. 하지만 현재 DNS 는 UDP 를 사용한다. 그렇다면 데이터 유실을 감수하고도 왜 DNS 는 UDP 기반으로 동작하는 것일까 ? 실제 TCP 는 UDP 에 비해 데이터를 담고, 보내는 전송 과정에서 딜레이가 있다. DNS 는 단지 아주 크기가 적은 데이터인 주소만 알면 되는데, TCP 는 너무 오래 걸린다. 그럼 데이터 유실 문제는 어떻게 할까 ? HTTP 커뮤니케이션에서는 HTTP Response 내 데이터 양이 매우 많을 수도 있고, 대량의 데이터가 유실되는 것은 큰 문제가 될 수 있다. 그러나 DNS 의 경우 DNS Query 내 Response 에 들어가는 데이터 자체가 매우 작다. 호스트 네임을 전송하고, IP 주소를 받아오는 것이 끝이므로 데이터 자체가 몇 바이트 채 되지 않는다. 유실될 확률이 적을 뿐더러, 유실이 되더라도 큰 부담이 없다. 무엇보다 UDP 기반으로 동작하는 것이 빠르고, TCP 보다 현실적으로 훨씬 효율적이다. 따라서 DNS는 현재 UDP 기반으로 동작한다.
소켓 (Socket)
- An interface between applicatioin and network
- The application creates a socket
- The socket type dictates the style of communication
- reliable vs best effort
- connection-oriented vs connectionless
- Once configured, the application can
- pass data to the socket for networt transmission
- receive data from the socket (transmitted through the networt by some other host)
소켓의 종류 (Two essential types of sockets)
SOCK_STREAM
- a.k.a. TCP
- reliable delivery
- in-order guaranteed
- connection-oriented
- bidirectional
SOCK_DGRAM
- a.k.a. UDP
- unreliable delivery
- no order guarantees
- no notion of "connection"
- app indicates dest, for each packet
- can send or receive
Socket Functions (TCP case)
TCP 기반의 소켓 통신을 위한 C 언어 함수에 대해 알아본다.
아래와 같은 순서로 함수를 호출하여 클라이언트와 서버를 연결한다.
TCP Server
- socket() :이 함수를 call 하며 Socket API 를 사용을 시작한다. socket 함수의 파라미터로 TCP Socket, UDP Socket 을 정할 수 있다.
- bind() : 생성한 Socket 을 몇 번 port 에 장착할지 정한다.
- listen() : 서버에 특화된 함수이다. 이 소켓을 듣는 용도로 쓰겠다는 것이다. 즉, 서버이므로 액션을 취하는 것이 아니라 클라이언트를 기다리는 것을 의미한다.
- accept() : bloking 함수이다. 클라이언트로부터 Request 가 올 때까지 기다린다.
blocks until connection from client
TCP Client
- socket() : 역시 Socket 을 시작한다.
- connect() : 상대 Server 에 TCP connection 을 맺는다. 서버 주소 등이 들어간다. bloking 함수이다.
TCP three-way handshaking
연결 후, TCP Client 는 write() 를 통해 데이터를 요청하고, TCP Server 는 read() 를 통해 데이터를 처리하는 것을 반복한다.
두 함수 역시 blocking 함수이다.
통신 완료 후, close() 를 통해 소켓을 종료한다.
UDP 기반 소켓 통신은 간단하다. Server 측에서 Socket 을 열고 Bind 하면, Client 측에서도 Socket 을 열고 바로 통신하면 된다.
Reference
WuT Com-Server: TCP/IP sockets application
Are you satisfied with our site but still have suggestions for improvement? Leave your comments here:
www.wut.de
'CS > Network' 카테고리의 다른 글
애플리케이션 레이어 (Application Layer) : HTTP 와 DNS (0) | 2023.06.27 |
---|---|
Transport Layer : TCP와 UDP (1) | 2022.07.11 |