소켓통신공부 첫 번째 글입니다.
소켓의 본질을 먼저 이해해봅시다.
소켓
- 소켓은 OS커널 영역에 구현되어있는 프로토콜요소의 추상화된 인터페이스
뭐 이런 저런 어려운 설명이 많은데 "File(파일)" 이라고 생각하면 쉬울 것 같습니다.
OS에서 커널 영역은 운영체제가 관리하는 영역입니다. 시스템 관리를 위한 영역(모드) 느낌이랄까요
(내용을 이해하기 위해서 꼭 완벽히 알아야하는 개념은 아닙니다.)
예를 들어,
A와 B는 모두 File입니다.
어떤 파일(A)을 따라갔더니 Bluetooth가 나오면 Bluetooth소켓,
어떤 파일(B)을 따라갔더니 IRDA가 나오면 IRDA소켓이 됩니다.
아무튼 소켓이라는 단어는 여러곳에 사용합니다.
여기서 우리가 알아볼건 TCP/UDP 소켓입니다.
TCP로 설명을 해보겠습니다.
소켓은 File입니다.
file을 사용하면 open, create, close, delete, write, read, execute(실행)중에 무언가를 하겠죠
그 행위들을 실행하는 주체는 file이 아닌 프로세스입니다.
file은 대상체입니다.
그런데 그 대상체인 file이 TCP스택에 대한 추상회된 인터페이스를 제공한다면 file이 아닌 TCP소켓이 되는것입니다.
결국 TCP소켓 역시 File이므로 주체인 Process가 Open, Create, Close, Delete할 수 있습니다.
그런데, TCP = Network이므로 Write는 send(), Read는 recv(Receive)라고 부릅니다.
또한 file이므로 파일 인덱스가 있겠죠?
이 열려진 파일의 인덱스가 File Descriptor가 됩니다.
이 File Descriptor에 대고 send(), recv()하게 됩니다.
c언어 같이 낮은 레벨의 언어에서 직접 소켓통신을 구현하려면 복잡하다고 합니다.
주소와 Port번호를 를 설정하고, connect()하고, close()하는등.. 또 blocking을 막기위해 여러작업을 해야합니다.
하지만 Swift는 c에 비하면 더욱 높은 수준의 언어이기 때문에 프레임워크화 되어있고,
메서드를 제공합니다.
IP와 Port를 알면 통신이 가능해요.
여기까지의 내용은 꼭 알고있어야 하는 내용은 아닙니다.
하지만 소켓통신을 공부하면서 소켓이 모르면 안된다는 생각에 정리해봤습니다.
앞으로 나올 것들은 OSI 7Layer(Network)의 내용들입니다.
여기부터는 꼭 알아야하는 개념을 간단히 정리해보겠습니다
[Segment, Stream, Packet, Segmentation, IP, Port]
OSI레이어중 layer4(TCP)의 데이터 단위는 segment, layer3(IP)의 단위는 packet입니다.
- 어떤 데이터 덩어리가 있다고 할 경우 데이터를 일정한 단위로 자르는 걸 Segmentation이라고 합니다.
- 또 잘려진 조각을 Segment라고 합니다.
- 이 잘려진 조각을 옮기기 쉬운 형태로 포장하면 Packet(패킷)이 됩니다.
- 이 패킷들을 쭉 연결해서 한줄로 쭉 조합되어 이어져있으면 Stream이라고 합니다.
- 소켓은 파일이라고 했으니 파일에 글을 쓰면 "abcdefg"처럼 이어서 작성이 됩니다. 이걸 Stream이라고 합니다.
- 각 건물들의 주소가 IP주소입니다.
- 건물의 호수가 Port가 됩니다.
소켓통신에서 사용되는 프로토콜
소켓통신에서 데이터를 보내기위해 사용되는 프로토콜은 대표적으로 두가지가 있습니다.
- TCP
- UDP
1. TCP(TransMission Control Protocol)(Stream Socket)
인터넷 상에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용되는 프로토콜입니다.
IP는 데이터의 배달, TCP는 패킷을 추적/관리 하게 됩니다.
패킷은 온전한 1개의 데이터가 아닙니다.
데이터는 여러개로 나뉘어져 보내지게되며, 조각조각 나누어진 데이터는 다시 온전히 합쳐져야 합니다.
(데이터덩어리 --> Segmentation --> Segment --> 패킷)
그러므로 순서를 부여하고, 손실을 확인, 재조립하게 됩니다. << TCP의 추적, 관리
TCP소켓의 특징
- 연결형 서비스로 신뢰성을 보장
- UDP보다 속도는 느림
- 3-way handshaking으로 연결을 설정하고 4-way handshaking으로 해제
- 논리적 경로(가상회선방식)를 설정합니다.
- 흐름제어, 혼잡제어가 가능합니다.
- 양방향 통신이며, 일대일 통신(unicast)입니다.
3-way handshaking
이 부분은 연결을 이루는 과정, 데이터를 주고받는 과정을 설명합니다.
1. Client 가 Server에 syn(연결요청)을 합니다.
2. Server는 Client에게 Ack, syn(연결요청)를 전송합니다.
여기서 Ack는 Acknowledge로 받았다는 "확인"을 의미합니다.
3. Clinet역시 Ack를 서버에 전송합니다.
이렇게 연결이 이루어지면 이 후 데이터를 전송하게됩니다.
Data가 전송중일 경우에는 패킷에 데이터가 포함됩니다.
Ack에는 데이터를 잘받았다는 "확인", 다음으로 받아야하는 패킷의 번호가 담겨있습니다.
만약 Ack을 일정 시간동안 받지 못했다면 패킷을 재전송하게됩니다.
(이 상황에선 Ack를 보냈으나 유실되었을 수도, 데이터가 유실되어 Ack를 보내지 못했을 수도 있습니다.)
이런 식으로 연결이 되며 높은 신뢰성과 높은 안정성을 제공합니다.
TCP의 가상 회선 방식
TCP의 특징중 가상회선방식을 사용한다는 설명이 있었습니다.
이는,
시간의 흐름을 보면 패킷들은 여러 경로가 있음에도 하나의 경로로만 전달됩니다.
이 파란색 선이 논리적 경로(가상회선)입니다. 설정하는 방식은 네트워크를 공부해보면 좋습니다.
이외에도 흐름제어를 제공하는데
흐름제어는 데이터를 수신하는 곳의 버퍼의 오버플로우를 방지하는 기능입니다. 데이터가 처리되기 전에 데이터들은 버퍼에 저장됩니다.
즉시 모두 처리되는게 아닌 cup가 작업을 처리해야되니까요.
패킷속에 할당된 버퍼의 크기를 함께보내 과하게 데이터가 한 번에 전달되어 문제가 생길 수 있으니 데이터의 양을 조절합니다.
또한 혼잡제어도 제공하는데
혼잡제어는 내트워크 내의 패킷이 과도하게 많아져, 라우터나 링크가 혼잡해지면 패킷손실, 지연증가 처럼 생길 수 있는 문제를 예방하는 기능입니다.
이런 모든 기능은 TCP Segment의 헤더에 포함됩니다. TCP 헤더에는 다양한 정보가 담겨있어 많은 기능을 합니다.
TCP헤더의 구조입니다.
이렇게 TCP는 다양한 기능을 제공해야합니다.
그 만큼 CPU의 부담이 커지므로 UDP보다 속도가 느려지게 됩니다.
따라서 TCP는 연속성보다 신뢰성 있는 연결을 중요시할 때 사용됩니다.(파일전송)
휴..
UDP(User Datagram Protocol)
UDP는 사용자 데이터그램 프로토콜입니다.
데이터를 데이터그램단위로 처리하는 프로토콜입니다.
여기서 데이터그램은
독립적인 관계를 지니는 패킷입니다.
UDP도 IP를 사용합니다.
비연결형 프로토콜이며 전송만 하게됩니다.
왜 비 연결형인지 알아봅시다.
연결을 위해 논리적인 경로가 할당되지 않습니다.
각각 패킷은 서로 다른 경로로 전송될 수 있습니다.
그러므로 서로 독립적인 관계로 도착의 순서가 보장되지 않습니다.
UDP의 특징
- 비 연결형 서비스로 데이터 그램 방식을 제공.
- 데이터를 주고 받을 때 신호 절차를 거치지 않는다.
- UDP헤더의 CheckSum필드를 통해 최소한의 오류만 검출
- 데이터가 유실될 수 있다. >> 신뢰성이 낮다.
- TCP보다 빠르다.
TCP의 반대라고 생각되는 부분이 많습니다.
TCP와 UDP 비교
TCP와 UDP를 비교하자면
TCP = 배달서비스, UDP = 라이브 스트리밍 서비스 라고 할 수 있습니다.
TCP 배달서비스는 패키지가 정확한 순서대로 안전하게 전달되어야 하며 파손/유실되면 다시 배달을 해야합니다.
UDP 라이브스트리밍은 실시간으로 스트리밍 되는 동안 모든 데이터그램이 반드시 필요한건 아닙니다. 재전송을 요청하고 기다리는건 실시간 에게는 치명적일테니 약간의 데이터그램이 누락되더라도 진행되어야하고, 빠르게 전송되어야 하기 때문입니다.
여기에선 Network과 OS등 기본 CS지식이 필요한 부분입니다.
소켓이 뭔지, 프로토콜이 뭔지 모르고 소켓통신을 공부할 순 없다고 생각되어 정리해봤습니다.