본문 바로가기
리눅스 이야기

도커 / k8s / 클라우드(AWS) 네트워크 완전 정복 미리보기 -리눅스 네트워크 I/O 과정

by reallinux1 2023. 9. 11.

도커 / k8s / 클라우드(AWS) 네트워크 완전 정복 미리보기 

-리눅스 네트워크 I/O 과정

 

안녕하세요 리얼리눅스 네트워크 완전 정복수업 입니다
네트워크에 대한 부분을 다룰 때  아무래도 네트워크 수업이 우리가 컴퓨터 공학을 전공하시거나 

컴퓨터공학과 관련된 수업을 또 들으신 분들이 네트워크 수업을 듣죠
그렇긴 하지만 이 네트워크 수업이라고 하는 게 어떻게 보면 되게 광범위하고
굉장히 이론적으로만 진행이 될 확률이 높습니다
하지만 우리 입장에서 정말 네트워크에 대해서 좀 알아야 되는 상황
그거에 대해서 깊게 이해를 해야 되는 상황이런 것들은 도커나 k8s 라든지 클라우드를 다루는 와중에 생겨요
실제로 그냥 우리가 서버를 운영하다가 네트워크에  대한 부분 때문에 문제가 생기거나
설정을 해야 되거나 이럴 때 굉장히 많이 부딪치거든요
그래서 여기서 네트워크 완전 수업은 그냥 이론적으로 공부하는 네트워크 수업이 아닙니다
이거는 쿠버네티스,도커 클라우드 환경을 고려해서 네트워크를 공부 하는 거고요
당연히 물론 네트워크에 대한 기본 기능 기본적인 개념들을 IPv4기준으로 해서
제일 기본이 되는 거죠

예를 들어서 뭐 라우팅에 대한 개념이라든지 그리고 여러가지 기본적으로
네트워크에 대한 개념들도 당연히 공부를 합니다
그래서 4주차에 있는 내용들이 굉장히 중요한 부분이에요
그리고 또 우리가 이제 컴퓨터공학 이라든지 네트워크수업을 들었을 때
그런 내용들을 배울 수 있는데 그걸 최대한 압축적으로 들어가면서도
우리가 도커/k8s/클라우드를 다룰 때 배워야 하는 내용들을
압축하여 넣었다고 보시면 될 것 같고요
근데 요것만 가지고는 안 돼요
사실 네트워크 공부한다고 하면 이거만 공부하는 경우들이 굉장히 많은데
이거만 공부해서는 잘 안 되는 이유가  뭐냐면  우리가 실질적으로 적용해야 되는 리눅스 거든요
그러면 리눅스 안에서 네트워크를 살펴볼 수도 없는 거예요
이론으로는 많이 알고 있는데 네트워크가 어떻게 돌아가는지  

어떻게 지나가는지 이런 것들을 볼 수 있는 방법이 전혀 없는 거죠 

이론적으로만 계속 접근할 뿐인 거죠
그래서 그런 것들이 한계에 많이 부딪혀요
그래서 우리가 1주차, 2주차,3주차의 부분에서 주로 많이 다루는 것들은
당연히 IPv4네트워크에 대한 기본을 나중에 공부하면서 여기에 있는 개념들이 여기에 결국에는 조금씩 다 녹아져 있는 것

들이긴 하지만 실전적으로 리눅스 안에서 네트워크를 잘 다루고 잘 확인할 수 있고 직접 까볼 수 있고
추적해 볼 수, 증명해볼 수 있는 것 이런 것들을 주로 많이 다루게 됩니다
그래서 더욱 중심적으로 다루게 되고요
시스템 핵심 정리 수업에서 사실은 네트워크에 다루잖아요
그런데 이런 부분들이 어느 정도는 조금은 같이 들어있죠 아예 안들어 있을 수는 없습니다 

하지만 여기서는 네트워크를 더 집중해서 다루기 때문에
또 다양한 실습들이 존재를 하고 어드벤스한 내용들도 함께 포함이 되어 있습니다
그리고 쿠버네티스, 도커 이런 곳에서도 네트워크에 대한 어떤 구조가 더 나름대로 있어요
그런데 그런 부분들도 우리가 이전에 기본수업때 어느 정도 다루기는 하지만
간략하게만 다루기 때문에 여기서 조금 더 세밀하게 다룰 거예요
좀 더 세밀하게 실험도 많이 해보고 그리고 또 더 나아가서는 BPF관련해서
또 이야기를 해볼 겁니다

BPF는 사실 실제로 관련해서 한글 자료를 검색해보시면 아마 제가 예전에 만들었던
자료들이 좀 나올 거예요
그리고 예전에 미국 보스턴에 가서 BPF 관련된 튜토리얼 이런 것들을 USENIX 컨퍼런스에서 발표를 하고
또 진행한 적이 있었고 국내에서도 많은 발표들을 많이 진행했었습니다
아무래도 BPF기술 같은 경우에는 리눅스 커널 안에서 최신기술이기 때문에
이런 것들을 core(코어) 단계까지 제대로 이해하고 있는 분들이 굉장히 적어요
그래서 저 같은 경우에는 tracing 많이 적용하면서 안에 있는 커널코드 전체를 다 분석을 했었고요
그리고 또 그 뿐만 아니라 여러가지 에 BPF에 대한 원리 그리고 

또 그거에 대한 사용사례 설명 이런 부분들을 잘 집어 넣어 놨습니다
그래서 이런 것들을 보시면서 최신기술인 BPF에 대해서 좀 이해를 해보고 적용하는 것에 대해서도
한번 수업으로 다뤄보도록 하겠습니다

첫 번째로 네트워크 I/O과정을 보도록 하겠습니다
서버 하고 클라이언트가 통신을 하게 되면 서버 프로그램은 nginx 아니면 자바프로그램 여러가지가 있을 수 있겠죠
그리고 그 서버랑 클라이언트가 통신을 할 수가 있겠는데 클라이언트하고 통신을 하기 전에
먼저 서버가 대기를 하고 있는 상황이죠
지금 사실은 서버부분하고 클라이언트부분의 완전한 최초부터 얘기를 하면 최초의 소켓시스템 콜이라든지
connect() 혹은 bind() 이런 함수들을 통해서  서버나 클라이언트가 세팅하고 연결하는 그런 과정들이 있어요
그건 이제 소스코드로 한번 볼 거예요
지금 얘기하는 거는 TCP IP통신을 기준으로 ESTABLISH된 상태 이후를 얘기하는 겁니다
그래서 왜냐하면 우리가 커넥션하는 과정에만 너무 집중하게 되면 실제 데이터가 오가는
플로우에 대해서 잘 놓치는 경우들이 많이 있거든요

실제 필드에서는 데이터가 오가는 과정이 훨씬 더 중요하기 때문에
그 부분을 일단 집중해서 보고요 실제 서버 소스코드 C로된 서버소스코드
그리고 클라이어트 소스코드도 하나씩 하나씩 다 분석해 보면서 우리가 공부했던 내용들 한번
연결짓는 시간도 가질 겁니다

 

자 우선은 리눅스안에서 서버 프로그램이 read라는 걸 통해서 일단은 대기를 할 수 있어요
그런데 그게 이제 뭐냐면 서버가 클라이언트하고 연결이 된 이후에 클라이언트로부터 어떤 데이터를 
읽기 위해서 대기한다라고 보시면 되거든요
이것도 이제 코드 상으로 이제 또 점검을 해볼 건데 어쨌든 클라이언트로부터의 어떤 데이터가
올 때까지 대기를 하는 그런 시간이 될 수 있습니다
클라이언트도 사실 마찬가지로 서로가 이제 통신을 하기 때문에 만약에 서버로부터의 어떤 데이터가 오는지에 대한 부분들도 클라이언트도 for문을 통해서 대기하면서 기다릴 수 있겠죠
그 다음에 클라이언트가 HTTP메세지로 만약에 예를 들어서 GET 요청 이런 거를 한다 라고 가정을 해본다면
클라이언트 입장에서 데이터를 보내기 위해서 이제 버퍼Push이라는 과정 조금 구체화해서 얘기를 하면
커널내부의 소켓퍼버가 있겠고요
거기 안에다가 패킷데이터를 집어넣은 다 라고 보시면 되요
그래서 그렇게 보실 수 있겠고  이 버퍼라는 거에 대한 부분들도 구체적으로 자료구조를 지금 확인을 해 볼 겁니다

어쨌든 리눅스는 C언어 프로그램이고요
그 C언어 프로그램이 네트워크를 제어하는 부분에 대한 기능들이 다 포함이 되어있단 말이에요
근데 그게 어떤 자료구조로 어떤 구조화를 시켜서 어떤 절차로 하는지에 대한 부분을 뼈대가 되는 부분은 알고
계셔야 돼요
그래야지 문제를 해결하거나 분석하시거나 그래도 기본 개념에 대한 부분들에 대해서
그 위에 대한 응용 개념을 쌓으실 때도 흔들림 없이 적용하실 수가 있겠습니다

 

자 일단은 어쨌든 소켓 버퍼에다가 패킷데이터를 집어넣고 나서 그 이후로 벌어지는 일이 뭐냐면
이 데이터만 보낼 수는 없어요
사실은 우편물을 보낼 때도 사실은 주소를 적어서 보내지
그냥 우편물 내용만 보낼 순 없잖아요 그렇기 때문에 이 데이터 이외에도
그리고 또 TCP IP Eth 헤더부분들을 다 세팅을 하게 됩니다
헤더부분이 어떻게 보면 우편물로 따지면은 뭐 박스에다가 이제 주소를 적고 약간 이런 개념으로 보실 수 있어요
그래서 이런 주소 부분들이 잘 적혀 있어야지 어쨌든 목적지 컴퓨터까지 전달을 할 수 있기 때문에
TCP에는 아무래도 포트번호 이런 게 주된 내용이 될 수 있겠고
목적지, 출발지, 포트번호 IP address같은 경우에도  출발지, 목적지, IP address
그리고 또 Eth같은 경우에는 맥 주소라고  실제 외부망으로 나가게 되면 이제 도착지는 게이트웨이 맥주소가 되고
그리고 출발지는 클라이언트의 맥 주소 이렇게 되겠고 내부망 안에서 통신을 하게 된다면
목적지든 출발지든 실제 머신에 하드웨어 맥주소가 기입이 된다 라고 보시면 될 것 같습니다

그래서 어쨌든 패키지 구성이 되고 나서
패키지 바깥으로 나갈 수가 있는데 이 패키지에 대해서 이제 지금 라이트 과정에 대해서 절차적으로 보게 된다면
syscall 있지만 이제 send 관련된 이제 시스템도 있긴 합니다
그러면 이거는 어쨌든 우리가 VFS 시스템 레이어를 내부적으로 거치게 되요
그래서 라이트를 했을 때 이게 실제로 SSD, 하드디스크에 들어있는 파일일 수도 있고요
아닐 수도 있죠
그래서 VFS 시스템 레이어를 거치게 되면 네트워크로 갈 수도 있고 안 그러면 실제 파일을 파일시스템포맷에 맞춰서 ext4라든지 BTRFS라든지 그런 쪽으로 이제 또 내려갈 수가 있겠죠
근데 네트워크 을 기준으로 라이트를 하게 됐을 때
어쨌든 소켓레이어로 넘어가게 돼서 TCP,IP, DD 디바이스 드라이버지요
레이어를 거치게 되면 L4, L3, L2를 거치게 되고 거쳐서 패킷들이 완성이 된 게
나오게 되면은 이 패킷이 바깥으로 나가게 되죠 그런 네트워크 카드를 통해서 바깥에 나가게 되고요 이 절차들을 정확하게 좀 짚어보실수가 있어야 돼요 지금 얘기하는 것들도 어느 정도는 좀 추상화를 시켜서 설명을 드리는 겁니다


하지만 요 부분까지는 우리가 적어도  A4용지에 전 과정을 적을 수 있도록 정리가 되 있으셔야 되요

안 그러면 항상 애매모호하고 항상 뭔가 두리뭉실하게 리눅스안에서의 네트워크 처리들을 이야기하게 되거든요
그래서 마지막에 세번째 절차....
 * 리얼리눅스 홈페이지 바로가기 

 

 

Real Linux | 최신트렌드 리눅스 전문교육|임베디드|서버

직장인을 위한 리눅스교육

reallinux.co.kr