네트워크와 BSD 소켓
2022. 4. 25. 01:36이 글은, 네트워크와 소켓 통신의 등장 배경과 개념을 이해하기 위한 글 입니다.
1. 네트워크 등장이 이유.
프로그램은, 인간의 인간의 의사를 모방하기 위한 목적으로
만들어진 도구, 도구가 만들어게된 이유가 가장 중요하다고 할 수 있습니다.
네트워크 역시, 그 등장 이유가 중요한데요. 사실, 네트워크 자체는 역사가 오래되었습니다.
우리가 흔히 일상 언어로 방송망, 전신망, 인간관계망을 사용하듯이, 여기서 망이라는 개념 자체가 네트워크랑 같은 의미입니다. 하지만 이 글에서 말하는 네트워크는, 컴퓨터 네트워크를 의미합니다.
- 컴퓨터 네트워크의 등장 이유 : 국방 측면에서 시작한 네트워크
2차 세계대전 중, 컴퓨터에 강력하게 고무된 이들은,
국방 영역으로 활용되기 시작합니다. 바로 전술 컴퓨터의 활용이죠.
컴퓨터가 군에서 사용되긴 했지만 몇가지 문제가 있었습니다.
컴퓨터 자체의 문제라기보다는, 컴퓨터가 참여하는 네트워크의 위상 구조의 문제였습니다.
즉, 그때 당시 네트워크는 '중앙 집중형' 이었습니다.
이건, 핵무기 공격에 취약했죠. 왜냐하면, 중앙이 마비되면 모든 시스템이 중단이 되버리니까요.
하지만, 분산형은 여러 노드가 연결되어있으므로, 하나가 고장이나거나 파괴되도 괜찮았습니다.
그래서 분산형 네트워크가 등장하기 시작했죠.
또한, 상업적 측면에서도 상업적 사용용도로 데이터 통신 방식을 연구 하기 시작했습니다.
즉, 패킷 데이터 통신기법이 개발되기 시작했죠. 그의 일부는, 데이터를 여러 조각으로 나눠 보내는 기술 등이 해당되었습니다.
즉, 도착지에서 재조립해야하는 단점이 있지만, 네트워크 트래픽을 여러개의 컴퓨터가 고유할 수 있으므로,
대량 트래픽이 오가는 네트워크에 적합한 방식이었죠.
이 때, 상업적 용도에서는, 대량의 데이터 통신을 위한 패킷데이터 통신이 필요했습니다.
위의 국방적인 측면에서 발전, 상업적인 수요의 증가로 인해, (추가적으로 상업적인 가능성을 발견하면서) 각 지역별로 떨어져 있는 네트워크들이 하나로 묶이게됩니다! -> 이떄 인터넷이 생겨남.
즉, 최종적으로,
패킷데이터 + 망형 -> 인터넷의 기반이 되었습니다.
인터넷은 수많은 네트워크들로 이루어져있습니다.
그래서, 분산네트워크라고도 불리죠. 그리고 패킷데이터 네트워크라도 볼룹니다.
- 많은 네트워크의 등장, 규약의 필요성
이렇게 2가지를 사용한다 했으니 두 가지측면에서 규약이 필요했습니다.
1. 분산 네트워크 구조 유지하기 위해 -> ip 프로토콜
네트워크는 링크와 노드로 구성되어잇는데, 노드를 구별할 수 있는 방법이 필요함.
네트워크에서, 특정 노드를 식별가능하게 하는 규약이 ip 프로토콜.
2. 통신을 보장하기 위한 프로토콜 -> TCP (순서가 뒤바뀌고, 훼손될 수 있음) 바로 TCP.
인터넷이 발달하게된 배경은, TCP와 IP의 역할이 절대적이었다고 할 수 있다.
데이터 흐름을 제어하기 위한 프로토콜 : TCP
-> 데이터를 쪼갬으로써, 여러개의 노드가 통신에 참여하도록 한다.
만약 쪼개지 않으면, 데이터를 보내는 동안 노드가 한 회선을 계속 점유하게 된다. 이런 단점을 극복함.
-> 그래서 TCP는 재조립, 훼손된 패킷을 재요청해야함.
일련번호, 전송번호에 대한 응답 2가지 매커니즘을 이용함.
<네트워크 프로그래밍>
네트워크 프로그래밍은 TCP 4계층에서, 응용계층에서 제공하는 규약을 이용해서,
프로그램을 개발하는 과정임.
물론 우리는 프로그래머이기 떄문에, 이 규약이 해당 프로그램언어로 기술되어야합니다.
다행히 이들 규약의 대부분은 소켓이라는 라이브러리 형태로 제공이 됨.
그러므로 실제 네트워크 프로그래밍은 소켓에서 제공하는 라이브러리 함수를 이용한
프로그래밍 과정이라고 정의할 수 있다.
데이터는 각 단계를 거치면서, 커뮤니케이션할 프로토콜을 선택함.
프로토콜은 선택햇다면, 프로토콜을 만족하는 정보를 데이터 앞에 덧 붙임.
인터넷으로 나갈때까지 각 단계의 프로토콜 정보가 데이터에 덧 붙여짐.
사실, 네트워크는 유닉스 기반으로 발전되고 개발되어왔음.
윈도우도 유닉스의 기술 상당부분을 차용하고 있다.
리눅스는 유닉스의 철학을 그대로 계승하고 있으며, 자유롭게 사용할 수 있고, 매우 성공적인 운영체제라서.
범 Unix 운영체제, Unix 기반, => 기술을 거의 공유. 개발도구/명령어들이 거의 동일해서, 호환이 잘됨
윈도우 <-> Unix 의 이동은 쉽지 않음.
하지만, 다행히 소켓은 운영체제 내 차이가 없이
BSD 소켓을 그대로 사용하고 있다.
그러므로 운영체제 상관없이 기술 공유 가능.
즉, 소켓 라이브러리에서 제공하는 함수 수준만 동일하다고 보면 좋다.
-
컴퓨터 네트워크가 시장에서 상업적으로 가능성을 보이자, at&t와 같은 몇몇 대기업들은
시장을 선점하기 위해 독자적인 네트쿼으 프로그램 도구를 개발하기 시작한다.
물론 이들 기업은 코드로 독점하는 방식으로 시장을 선점하길 원했음.
BSD unix를 개발하기도한 uc 버클리 대학은, 수많은 프로그램들을 개발했는데,
1989년 자체적으로 소켓을 개발해서 자유롭게 사용할 수 있또록 배포해버림 ->이걸 BSD소켓이라함.
얼마안가서 이 BSD 소켓으 네트워크 프로그래밍 개발을 위한 산업 표준이 됨.
즉, 네트워크 프로그래밍이라하면, 소켓 네트워크 프로그래밍을 의미할 만큼
독보적으로 사용하고 있음.
"BSD소켓은 C로된 API로 네트워크 프로그램을 개발하기 위한 함수의 모음을 제공합니다."
BSD 소켓
- UC Berkeley에서 1989년 개발
- 네트워크 프로그래밍 개발을 위한 C API 지원
- 네트워크 프로그래밍 개발을 위한 산업 표준
- 모든 유닉스와 리눅스 그리고 윈도우에서 채택
3장
프로토콜을 구현한 코드가 있어야, 프로그램을 만들 수 있다.
<1. 소켓이란 무엇인가>
네트워크 프로그래밍 개발자는 TCP/IP 4계층에서 개발한다.
그러므로, TCP/IP 4계층에서, 전송계층 프로토콜만 신경쓰면 된다.
하지만, 프로토콜은 명대사일 뿐.
프로그램을 만들기 위해선 구체적인 구현물인 함수가 필요함 (TCP함수, UDP함수 등등)
즉, TCP/UDP 함수가 필요한데
이 때, 소켓은 이러한 함수들의 모음을 제공한다.
그러니 TCP 4계층위에 소켓이 존재한다. 그래서, 프로그래머는 전송계층의 세부적인 프로토콜의 명세를 일일이
구현할 필요 없이 네트워크 프로그램을 만들 수 있게 된다.
소켓은 함수의 모음 즉 라이브러리다.!
소켓을 이용하면 대부분의 경우 전송계층, 다른 프로토콜에 신경쓰지 않고 개발 가능
하지만, 더 낮은 (IP) 프로토콜을 직접 조작하는 경우도 가끔 생김.
소켓은 프로토콜 명세서를 코드로 구현한거, 그래서 다양한 종류의 소켓 라이브러리가 존제할 수 도 있음.
즉, a회사 소켓, b회사 소켓 등등.
AT&T가 만든 소켓이 있었음. (다행히 UC 버클리 대학에서 BSD라는 소켓을 만들고 공개해버림, 그래서 무료로 사용가능.)
여기서 만든 BSD 소켓은 매우 훌륭해서, 다들 이 소켓을 이용해서 네트워크 프로그램을 개발하기 시작함.
당연하죠, 공자니까요, 그래서 사실상 산업 표준이 됨.
"소켓이라하면 100% BSD 소켓이라 생각하면 됨"
bsd 소켓이 성공한 다른 이유
- c언어로 개발되서.
소켓이 하는 일.
대략 알고있겠지만,
인터넷에서 컴퓨터와 컴퓨터를 연결해주는 일을 함.
하지만, 소켓을 컴퓨터와 컴퓨터 연결로 보는 것을 옳은 관점이 아님.
소프트웨어와 소프트웨어 연결로 봐야한다.
"소켓은 인터넷과 소프트웨어 사이에 놓여서 소프트웨어를 서로 연결하는 일을 함."
연결을 만든 후, 인터넷으로 데이터 보내고, 전송된 데이터를 소프트웨어에 다시 전달하는 일을 함.
<사진>
네트워크 연결 모델
연결에는 다양한 방식이 있다.
1. 서버 & 클라이언트 모델
2. 매니저 & 에이전트 모델
3. P2P 모델
어떤 정보를 주고받느냐에 따라서 달라짐.
2.방식은 매너지가 에이전트에게 요청함. 즉 1.과 2.의 차이는 어떤 쪽이 먼저 데이터를 요청하느냐임.
<서비스포트>
프로그램을 찾아야한다. 어떻게 찾아야할까?
프로그램의 위치는 포트로 찾는다.
<포트 번호 범위>
- 포트 번호 크기 : short int (1-65536)
- 시스템 포트 1-1024 <- 루트 권한을 가진 사용자만이 사용할 수 있음.
4장
프로그램은 논리의 흐름을 코드로 구현한거임.
"작업 흐름"을 정의하고, 그걸 코드로 구현해야함.
전화대신 필요한건 소켓이
즉, 이 소켓이 인터넷을 연결시켜주는 접점 역할을 한다.
하지만, 아이덴티티를 부여해야한다. 전화번호와 같은.
그래야 링크가 개설될 수 있음.
이 때, 그 아이덴티티는 IP주소,.
상대방의 컴퓨터를 찾아기기위한 IP주소와
그리고 찾아낸 컴퓨터에서 프로그램을 찾아가기 위한 포트번호를 알면
상대방과 통신할 수 있다. 정확히말하면 상대방으 프로그램.
네트워크 프로그램으 흐름
흐름 1.
송신측
소켓 생성 -> 포트번호 부여 -> 상대편 IP/포트 주소로 연결 -> 통신 -> 종료
수신측
소켓 생성 -> 포트번호 부여 -> 상대편 연결 기다리기 -> 통신 -> 종료
이러한 흐름은 소켓 API가 제공하고 있으므로, 그걸 선택해서, 배치하면 끝입니다.~
--
개념 체크
Q. 데이터의 흐름을 제어하기위한 프로토콜은?
A. TCP
Q. 패킷의 경로설정을 위한 프로토콜은?
A. IP
Q. 소켓은 뭐냐?
A. 함수의 모음, 즉 라이브러리다.
Q. 인터넷에서 데이터는 무슨 통신을 하는가?
A. 패킷 통신
그 이유는 효율적인 데이터 통신을 보장하기 위함.
참고자료 및 출처
https://www.youtube.com/watch?v=ClJqH617fzE&list=PLVsNizTWUw7GZy4UA9pntGRC9IIXIYiHm&index=2
다음은, ioctl 등 다른 ipc를 알아보는게 좋을 것 같다.
'네트워크 > 네트워크' 카테고리의 다른 글
[네트워크] Narrow Network란? 네로우 네트워크 (0) | 2022.06.22 |
---|---|
[네트워크] 기술: 터널링 (0) | 2022.04.28 |
[네트워크] TCP 3-way 핸드쉐이크 및 4-way 핸드쉐이크 (0) | 2022.03.11 |
[네트워크] 와이어샤크 공부하기 좋은 pcap 예제 모음 (0) | 2022.03.11 |
RS/RA, Link local address, global IPv6 address (0) | 2021.11.26 |