네트워크 프로그래밍에 대해서 자세하게 소개를 하는 것은 시스템 프로그래밍을 정리하는 목적에서 볼 때 배보다 배꼽이 더 클 수 있으므로 간략하게 소개해보려 합니다.
네트워킹을 위해서는 client와 server process가 필요합니다. server는 client의 연결을 항상 기다리고 있고 client가 요청하여서 연결이 되었을 때에 비로소 네트워킹이 동작하게 됩니다.
Target address가 알맞은 프로세스 or 스레드에 갈 수 있도록 해주는 것이 바로 IP 주소와 Port #입니다. 먼저 이 패킷은 IP 주소를 통해 node에 도착하게 되고 그 node 안에서 Port #를 통해 적절한 프로세스 or 스레드로 가는 것입니다. 이 과정을 도식화한 것이 아래의 그림입니다.
IP 주소와 Port #를 통해 알맞은 프로세스에 도착하게 되고 도착한 프로세스에서 Socket을 통해 통신을 하게 됩니다.
여기서는 크게 통신의 종류로 TCP와 UDP를 다뤄보려 합니다.
TCP: Connection-oriented로 동작하며 각각의 client는 무조건 link를 통해 서로 연결되어야 통신이 가능하며 데이터의 송, 수신을 보장합니다. 안정적이고 신뢰성이 높지만 client가 많아질수록 생성, 유지해야 될 link가 많아지므로 비용이 큽니다. 쉽게 생각하여 전화로 통신하는 경우가 이에 해당합니다.
UDP: Connectionless로 동작하며 하나의 메시지를 보내는 것 같이 단순한 통신의 경우에 유용합니다. link를 생성하지 않아서 서버에 부하가 작고 broadcast가 가능합니다. 쉽게 생각하여 편지를 통하여 메시지를 주고받는 경우가 이에 해당합니다.
그 밖의 특징들은 아래와 같습니다.
아래는 TCP로 통신하는 과정을 나타냅니다.
여기에서 socket이나 bind는 함수의 실행 순서를 나타낸 것입니다. 중요한 것은 SYN, ACK+SYN, ACK 같은 표시들입니다. TCP는 연결하여 데이터를 전송하기 위해 3 way handshake라는 기법을 사용합니다. SYN, ACK+SYN, ACK이 바로 그것입니다.
이것은 아래에 연결을 종료할 때도 마찬가지라는 것을 볼 수 있습니다.
이렇게 통신을 연결하고 종료하는 이유는 서로가 통신을 제대로 연결하고 종료됨을 확인하기 위해서입니다. 상대방에게 들리지 않으면 아무리 좋은 말이라도 소용이 없는 것처럼 먼저 통신이 제대로 이루어짐을 양쪽 모두 확인하고 상호 간에 대화를 시작하는 것입니다.
아래는 UDP로 통신하는 과정을 나타냅니다.
UDP는 link가 없는 대신 메시지를 보내고 받을 때 어디서 왔고 어디로 보낼 것인지를 계속 명시해주어야 합니다.