카테고리 없음

리눅스 네트워크, 소켓

머리큰개발자 2021. 5. 2. 15:43

네트워크는 물리적으로 분리되어 있는 기기간 정보를 교환할 수 있게 사용되는 모든 전기 통신 기기와 전송로의 결합을

의미한다.

현재는 대부분 컴퓨터의 통신망에 관련하여 사용되고, 규모에 따라 LAN, MAN, WAN 등으로 분류된다. (좀 애매해지긴 했음)

통신은 크게 5단계를 거친다.

1. 정보를 송신할 수 있도록 바꾼다.

2. 정보를 보낸다.

3. 네트워크를 통해 전송된다.

4. 네트워크로 부터 정보를 받는다.

5. 받은 정보를 사용자가 이용할 수 있도록 바꾼다.

이 5단계를 조금 더 세분화하여 구분한 뒤에 모듈화한다. 모듈화란 역할을 나누어 자신의 역할만 수행하고 결과물을 넘기는 유형을 말하며 우리말로 분업이라고 생각하면 된다.

 

물론 통신을 할 때는 송수신된 데이터를 신뢰할 수 있어야한다.가장 기본적으로 사용되었던 것은 파이프에서 이용되던 Parity Check이다. 1의 개수를 세어서 홀수인지 짝수인지 구분하여 판단하는 것인데, 1이 2배수로 빠져있거나 들어와있따면 검출할 수 없다. 그래서 행렬처럼 2차원으로 데이터를 넣어서 가로 세로 페리티를 조사하는 방식도 있다.

 

하지만 현재 사용되는 방식은 CRC(Cyclic Redundancy Check)이다. 데이터의 값을 특정 숫자로 나누어서 남은 나머지를 데이터에 덧붙여서 보내는 방식이다. 어디가 에러인지는 모르지만 아무튼 에러가 있는 것을 검출할 수 있으며, CRC-16, RT-ITU, CRC-32 등이 있는데 검색해보길 바라며, 1비트, 2비트, 연속적인 비트에러 등을 모두 검출할 수 있다.

 

OSI(Open System Interconnection)에서는 7단계로 분리하여 사용한다.

wikipedia

1. 물리적 전송 - 통신 매체를 통해 정보를 전달한다.

2. 물리적 주소 관리 - 오류 없이 기기간의 1:1 연결을 위해 주소를 관리한다. 

3. 논리적 주소 관리 - 네트워크에서 사용되는 논리적 주소를 연결하고 관리하기 위해 사용된다.

4. 단말기 주소 관리 - 단말간의 오류 없이 연결하기 

5. 연결 관리 - 연결을 확립하고 유지, 종료한다.

6. 데이터 변환 - 데이터를 보내거나 받기 위해 변환하고 관리한다.

7. 응용 프로그램 - 사용자가 이용하는 프로그램.

 

 

통신 5단계와 별로 다를바 없다. 조금 더 세분화되고 모듈화 된 것을 제외하면 같다. 여기서 1단계->7단계까지 가는 동안 조금 더 넓은 네트워크를 다룰 수 있게 된다. 

 

실제로 사용되는 방식은 TCP/IP 방식이다.

TCP/IP 는 다음과 같다.

1. Network Access(Ethernet) - 동일한 네트워크를 사용하는 기기간 1:1 근거리 통신 (1~2단계)

2. Internet(IP) - 다른 네트워크 기기간 N:N 통신 (1~3)

3. TCP/UDP - End to End 전달 (1~4)

4. 응용 프로그램(smtp, http, telnet, ...)  (1~7)

 

LAN(Local Area Network) 

가까운 지역을 묶는 네트워크 방식이다. 현재는 이더넷이 일반적으로 사용된다.

LAN은 노드간 연결 형태에 따라 BUS , RING, STAR 등으로 분류되는데 현재는 중간에 HUB를 둔 STAR형태를 가장 많이 쓴다. BUS는 Imbedded에서 많이 본 것 같다.

STAR의 장점은 새롭게 연결하거나 변경하기가 쉽고 보안성이 높다. 하지만 설치비용이 높고 신뢰도가 타 방식에 비해 조금 낮다. 

물리적인 전송을 위해선 케이블이 필요한데, 튼튼하고 안전하게 전송하기 위해 UTP(Unshielded Twisted Pair) 케이블을 사용하거나(우리가 흔히 보는 LAN선) STP(Shielded Twisted Pair) 케이블을 사용한다. 

또한 안정적인 신호 전송을 위해 Coaxial Cable을 사용하기도 한다.(뚜꺼운거)

요즘은 광 케이블이라 해서 굴절률이 서로 다른 물질 2개를 감싸서 케이블로 만들어서 빛으로 데이터를 전송하는 광섬유를 사용하기도 한다. 외부 전자기파로부터 간섭이 없기 때문에 초 장거리 연결에 대해 대용량 통신에 사용된다. 물론 유리처럼 전반사시키는 물질로 만들어져서 중간에 끊어지면 수리가 매----우 어렵다. 해저 케이블처럼 큰 것도 광섬유를 이용할 수 있는데 엄청난 기술력이 필요하기 때문에 다룰 수 있는 기업이 몇 군데 없다. 우리나라에선 자랑스러운 LS가 있다!

 

LAN의 표준은 IEEE 802이다. 802.x에 따라서 역할 등이 다르다. 찾아보길 권장.

 

장비를 연결하기 위해 여러 장치들이 필요하다.

허브는 여러 장치를 쉽게 연결하고 설치하기 위한 기기이며, 스위치는 연결된 기기 중 특정 포트로 데이터를 전달시켜주는 하드웨어이며 브릿지는 같은 역할이지만 소프트웨어적으로 작동한다. 라우터는 네트워크끼리 연결하기 위해서 사용한다. 가령 WAN과 LAN을 연결하기 위해 사용된다. 

 

현재 사용되는 TCP/IP 의 프로토콜을 살펴보자.

낮은 계층에서부터 살펴본다.

 

이더넷 프레임(Ethernet Frame)

각 단계로 넘어갈 때마다 필요한 정보가 다르다. 

만약 내가 필요한 정보가 a라면 a에 대한 오류 확인(CRC)과 어디로 데이터가 가는지, 그 길이는 어느 정도인지 등을 미리 알 수 있는 헤더(Header)가 앞 뒤로 붙어야한다. 각 단계별로 확인해야하는 정보가 다르기 때문에 헤더는 각 단계별로 다르게 앞에 붙어야하므로 헤더만 5개는 붙는다. 

아무튼 이더넷 프레임은 다음과 같이 생겼다.

wikipedia

1. 헤더

  1-1.프리앰블(Preamble) - 7B 전송의 시작을 알리고 동기 신호를 제공함 10101010 반복

  1-2.SFD (Start Frame Delimiter) - 1B로 이루어진 프레임의 시작부분(1010...101011의 11부분)

  1-3.목적지 MAC 주소 - 6B로 이루어진 주소. 앞 3B는 제조사, 뒤 3B는 제조사의 일련번호를 의미한다.

  1-4.출발지 MAC 주소 - 6B로 이루어진 전송 출발지의 MAC주소

  1-5.길이와 타입 - 2B로 이루어짐. 데이터의 길이는 1500B까지 가능하고, 1536이 넘으면 프로토콜을 표시

2. 데이터(payload) - 46B~1500B이며 46B이하면 패딩을 0으로 채워서 만든다.

3. FCS(Frame Check Sequence) - 4B이며 CRC-32를 이용한다. 이 때 Preamble 과 SFD를 제외한 데이터를 이용한다.

 

IP 

그 다음으로는 N:N 통신이 가능한 Internet Protocol(IP)이다. 

이더넷과는 다르게 MAC주소가 아닌 논리주소를 사용하여 결정하며 변경이 가능하다.  

네트워크 층에서 사용되며 몇 B인지에 따라 IPV4(4B) IPV6(6B)등으로 구분된다. 이전에는 IPV4를 사용하다가 네트워크가 워낙 많아져서 꽉꽉 차다보니 조금 더 늘려서 사용하고 있다. 

위에서 사용된 장비 중 라우터를 사용하여 경로를 지정하며, 네트워크 ID + 호스트 ID로 경로를 지정한다.

네트워크 ID는 해당 네트워크를 구분하기 위해 사용하며, 호스트 ID는 해당 네트워크에서 호스트를 구분할 때 사용한다. 총 IPV4 의 경우 2B씩 나눠서 표시하며 이것이 우리가 익숙한 192.168.0.1 처럼 십진수로 나타내어 보여준다. 

물론 실제로는 십진수를 기계가 직접 사용하지 않는다.

이 ID 또한 방식에 따라 ClassABCDE 로 나뉘어지는데, Net ID 가 각각 1,2,3 B로 늘어나며, D는 그룹만들때, E는 사용하지 않는다. 보통은 네트워크가 굉장히 크기 때문에, 거대한 네트워크에선 class C를 사용한다.

 

IP의 데이터 프레임은 이더넷과 조금 다르다.

이더넷의 헤더와 오류 확인 코드를 제외한 Payload가 넘어오면, Payload에서도 헤더를 나누어서 확인한다. 

IP Protocol의 Stack 은 최대 65536B 로 구성되어 있고, 그 중 헤더는 20~60B 를 차지한다. 

wikipedia

 

자세한건 어려워서 공부하지 않았는데, ver은 IPv4일 경우0100(4) 이고, IHL은 헤더길이, TOS는 service type으로 서비스 품질인 TELNET이나 FTP 등, total length 는 16비트까지 포현하며 전체길이-헤더길이를 의미한다. ID는 식별할 때 사용하며, flag는 단편화된 조각들을 구분할 때 몇 번째 조각인지 구분하는데 사용한다. Fragment offset은 재조립할 때 위치 정보를 포함하고 있으며, TTL(time to live)은 수명으로 라우터를 지날 때마다 1씩 감소하여 0이 되면 timeout이 난다. protocol 은 IP 계층을 이용하는 상위 계층 프로토콜(TCP, UDP 등)을 뜻하며, Checksum은 IP헤더의 오류를 확인하기 위한 정보다.

 

TCP/UDP - Transport Layer Protocol

4계층에서 사용하는 프로토콜이다. 

IP 3층(Network Layer)에서 네트워크 간 N:N 통신을 했다면 4계층에선 응용 프로그램을 구분하여 정보를 전달해줘야한다. 이 때 사용되는 것이 Port Address이다. 

즉, 보내는 측에서 Client, Server주소를 담아 TCP/UDP -> IP -> Ethernet(MAC) 으로 보내면 받는 측에서 Ethernet->IP->TCP/UDP를 거쳐 응용프로그램으로 전달된다. 이 때 TCP/UDP -> App 으로 전달될 때 사용되는 것이 Port Address이다.

서버의 경우 이미 알려진 포트주소를 사용하기로 약속이 되어 있는데, 이를 벗어나 사용하면 안된다.

wikipedia

 

물론 TCP와 UDP도 차이가 있다.

UDP(User Datagram Protocol)

UDP는 아주아주 간단한 구조로 이루어져 있기 때문에 신뢰성보다 실시간 송수신이 중요한 경우에 사용된다. 옛날 피시방에서 스타크래프트를 할 때 UDP를 사용한 이유가 바로 이것 때문이다. 물론 경험이 있으신 분들은 알겠지만, UDP를 이용한 경우 렉은 덜하지만 가끔 명령이 무시되는 등 키가 먹지 않을 때가 있다. 이는 실시간성을 중요하게 여기기 때문에 데이터가 정확한지 확인하지 않기 때문에 발생한다.

UDP는 또한 더 상위 계층에서 신뢰성이 보장되거나, 데이터가 반복적으로 전달되는 경우에도 유용하게 사용된다.

 

wikipedia

 

각각 16비트씩을 차지하고 있고, 출발지 목적지 정보와 헤더를 포함한 전체 길이, 아주 간단한 checksum 정보를 포함한다.

 

TCP(Transmission Control Protoco)

UDP와는 다르게 신뢰성을 더 중요하게 여길 때 사용된다. 신뢰성을 위해 자잘한 헤더가 추가되기 때문에 UDP보다 훨씬 복잡한 구조를 띄고 있다.

 

wikipedia

출발지/목적지까진 유사하지만 그 뒤로는 너-무 다르다. 자세한건 wiki를 참고하고...

중요한 것은 신뢰성이기 때문에 잘 연결되었는지를 확인해야한다.

연결 방식의 이름은 handshake라고 부르며, 자세한건 모르겠지만, synchronize시키기 위한 전송을 보내면 Acknowledge로 응답하여 서로 연결하는 방식을 사용하는 것 같다.

 

TCP/UDP까지 왔다면 그 다음은 응용 프로그램을 이용할 수 있다.

5층 이후로 부턴 응용계층 프로토콜을 사용하며, 사용자가 직접 사용할 수 있다. 

FTP, Telnet, SMTP, DNS, TFTP 등 슬슬 익숙한 이름이 나온다.

얘네는 나중에 원론적인 것 말고 조금 더 공부해야 될 것 같다.

 

소켓(Socket)

이제부터는 직접적으로 코드를 사용하여 이용해본다.

소켓은 컴퓨터간 접하는 통신 객체를 추상적으로 가리키는 단어이며, 통신을 위한 API가 마련되어 있기 때문에 소켓API를 이용하여 정보 교환을 하면 된다.

wikipedia

기존에 알고 있던 파이프와 Shared Memory, Message Queue 등도 편리하고 간단하게 사용되었지만 인터넷 소켓을 사용하면 내가 사용하는 프로세스 뿐 아니라 원거리 프로세스끼리도 통신이 가능하므로 엄청나게 많이 사용된다.

출처 - C++ Tutorial: Sockets - Server & Client - 2020 (bogotobogo.com)

출처 - C++ Tutorial: Sockets - Server & Client - 2020 (bogotobogo.com)

 

C++ Tutorial: Sockets - Server & Client - 2020

Ph.D. / Golden Gate Ave, San Francisco / Seoul National Univ / Carnegie Mellon / UC Berkeley / DevOps / Deep Learning / Visualization

www.bogotobogo.com

TCP냐 UDP냐에 따라서도 소켓 통신 방식이 다르다.

소켓 API를 사용하는 방법과 이해에 있어서는 다음 글을 참고한다.

조인시 위키: Socket Layer (archive.org)

 

https://web.archive.org/web/20080422072552/http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/socket_layer

 

web.archive.org

 

어우.. 통신은 너무 어렵다.

반이중과 전이중(Duplex)를 이용하기 위한 방법과, 서버와 Client를 연결하여 이용하는 방식도 구현해봤는데 사실상 내힘으로 한게 아니라서 잘 모르겠다. 다른 블로그나 Github를 참고하자..