들어가기 전많은 TCP Connection이 생성되면, 파일 디스크립터가 많이 생성되어 서버에 영향을 준다라는 생각을 했다. 그런데 TCP Connection이 1개 생겼을 때 얼마만큼의 리소스를 사용하기 때문에 서버에 영향을 미치는지는 잘 알지 못했다. 이 부분을 잘 이해해보려고 글을 작성한다. 파일 디스크립터란? 파일 디스크립터는 OS가 프로세스 내에서 파일 / 다른 입출력 자원을 가리키는 역할을 하는 정수값이다. DB로 생각하면 PK 값으로 생각할 수 있고, 파일 디스크립터 번호로 조회하면 이 파일과 연결된 파일 엔트리를 확인할 수 있게 되어있다. 파일 디스크립터는 0보다 큰 정수로 표현되며, 파일디스크립터 0~2는 stdin, stdout, stderr로 예약되어있다. 즉, 사용자가 특정 파일을..
들어가기 전이전 글에서 파일 디스크립터에 대해 알게 되어 공부하던 중 한 가지 의문점이 생겼다. TCP 커넥션은 어느 레벨에서 처리가 되는걸까?서버쪽 소켓은 하나만 열리는데, 수백 대의 클라이언트가 요청을 보내면 서버는 하나의 소켓만으로 모든 읽기 / 쓰기 작업을 처리하는 것일까?소켓은 어느 레벨에서 관리되는 것일까?위 질문에 대해서 알고 싶어서 전반적인 내용을 공부하고, 코드로 작성하고 디버깅하면서 실제로 그런지를 확인해보려고 한다. 클라이언트 - 서버 TCP 연결클라이언트가 데이터를 전송하기 위해 send(), write()를 호출하면 데이터는 클라이언트의 소켓에서 네트워크를 통해 서버로 전달된다. (IP만으로 찾아감)서버의 네트워크 인터페이스(NIC)는 받은 데이터를 서버 운영체제에게 전달한다. 서..
들어가기 전얼마 전, HTTP/HTTPS Proxy 서버를 만드는 방법 중에는 HTTP의 'CONNECT 메서드'를 이용한 TCP 터널링 방식이 있다는 이야기를 들었다. 그러나 나는 이런 쪽에 지식이 전혀 없어서 알아 들을 수 없었다. 백문이 불여일견이라고 만들어보면서 TCP 터널링이 어떤 개념인지 알아보려고 한다. 이 글에서는 파이썬을 이용해 간단하게나마 구현해보고 개념을 이해해본다. HTTP / HTTPS Proxy 서버란?Proxy는 '대리인'이라는 뜻을 가지고 있다. 이 뜻과 비슷하게 HTTP / HTTPS Proxy 서버는 클라이언트에게 요청을 Upstream 서버 대신 받는다. 그리고 받은 요청을 Upstream 서버로 보내주고, Upstream 서버가 내려준 응답을 클라이언트에게 내려주는 ..
1. Establish TCP Connection클라이언트가 서버에게 SSH 요청을 보내면 가장 먼저 서버 - 클라이언트 간의 TCP 연결이 이루어진다. 서버는 주로 Port 22를 listen하고 있고, 클라이언트는 임의의 Port에 바인딩 되어서 TCP Connection이 생성된다. TCP Connection이 생성되면, SSH 세션이 생성된다. 이 SSH 세션 내에서 다음 작업들을 진행하게 될 것이다세션 초기화클라이언트 - 서버 키 교환세션 키 생성신원 인증 등등2. Supported Version NegotiationTCP 연결이 설정되면 클라이언트 - 서버는 SSH 프로토콜 버전을 서로 교환한다. 메세지 형식은 'SSH-2.0-'으로 시작하는 문자열을 교환하는데, 예를 들면 'SSH-2.0-O..
인프콘 네트워킹 준비 완료https://www.rallit.com/resumes/67@silverprize/%EC%95%88%EC%83%81%ED%98%81?theme=STANDARD 안상혁 - Server Developer 이력서 www.rallit.com현재 서버개발자로 일하고 있으며, 인프런에서 제공하는 다양한 강의를 통해 꾸준히 성장하고 있는 인프런의 팬입니다! 이번 인프콘에 참가하고 싶다는 간절한 마음을 담아 이 글을 작성하게 되었습니다!저는 서버 개발자로 2년간 일을 해오고 있으며, 인프런에서 많은 강의들을 수강하며 공부한 덕분에 비전공자지만 회사에 잘 적응해나가고 있습니다. 허나 혼자서 공부하는 것에는 한계가 있어 다른 분들이 공부한 내용들을 듣고 싶고, 주변에 개발자가 많이 없다보니 개발..
FixtureFixture는 테스트가 시작하기 전 필요한 인자를 제공하거나, 상태를 정의하는데 사용한다. 예를 들어 다음과 같은 역할에 사용할 수 있다. SUT를 생성과 협력 관계의 인스턴스를 미리 설정된 조건으로 생성하고 제공한다. SUT, 혹은 통제할 수 없는 외부 인스턴스의 행동을 미리 지정한다. (Mocking 형태) Basic Fixture 생성해보기class Fruit: def __init__(self, name): self.name = name def __eq__(self, other): return self.name == other.name@pytest.fixturedef fruit_apple(): return Fruit('apple')@pytest..
들어가기 전이 글은 HTTP/2 in action 4장을 읽으며 공부한 글입니다. 4.1 HTTP/1.2가 아니라 HTTP/2인 이유바이너리 프로토콜 (프레임 기반으로 메세지를 주고 받음)동기적이 아니라 다중화 (한 커넥션에서 여러 스트림을 보낼 수 있음) 흐름 제어 (TCP 수준이 아니라 HTTP/2 수준)스트림 우선순위화헤더 압축 (HTTP/1.1까지는 헤더압축 없음) 서버 푸시HTTP/2는 HTTP/1.x 프로토콜의 성능을 개선하기 위해 만들어진 프로토콜이고, 위 개선점이 존재한다. 일반 개발자들은 개발함에 있어서 HTTP/2, HTTP/1.x를 구분할 필요는 없다. HTTP/2 역시 GET, POST 같은 메서드를 사용해 요청하고 200, 300 같은 응답 코드를 받는 방식으로 동작하기 때문이다...
https://armeria.dev/docs/server-annotated-service/#parameter-injection Annotated services — Armeria documentationAnnotated services Visit armeria-examples to find a fully working example. Armeria provides a way to write an HTTP service using annotations. It helps a user make his or her code simple and easy to understand. A user is able to run an HTTP service by fe…armeria.dev https://github.com/..
들어가기 전 이 글은 핵심 이론부터 프로그래밍 실습까지 분산 컴퓨팅을 읽고 정리한 글입니다. 몇몇 참고 글도 있습니다. 요약 분산 시스템의 스냅샷은 프로세스 / 채널 State가 모두 포함됨. 분산 시스템의 스냅샷을 챈디 - 램포트 알고리즘을 통해서 작성할 수 있음. 챈디 - 램포트 알고리즘은 마커를 이용해서 채널의 State를 정확히 기록함. 10.1 단체 메세징 어플리케이션 문제 10.2 벡터 시계 10.3 전역 스냅샷 분산 시스템에서 특정 시점의 상태를 잘 보존해둔다면 분산 시스템 운영에 많은 도움이 될 수 있다. 예를 들어 장애가 발생해서 분산 시스템을 전체 재기동 해야하는 경우, 해당 시점의 상태로 돌아가는데 사용할 수 있기 때문이다. 분산 시스템에서 상태 보존의 대상이 되는 것은 크게 두 가지..
들어가기 전 이 글은 핵심 이론부터 프로그래밍 실습까지 분산 컴퓨팅을 읽고 정리한 글입니다. 몇몇 참고 글도 있습니다. 요약 분산 시스템의 참여자들은 시간 동기화가 되어야 하는 경우가 많음. 분산 시스템에서 시간 동기화가 이루어지지 않는다면, Data Inconsistency가 발생할 수 있음. 분산 시스템의 완전한 시간 동기화는 '절대적 시간' 기준으로는 달성하기 어려움. 분산 시스템의 시간 동기화는 '램포트 시계'를 기준으로 '논리적 시간'으로 동기화 할 수 있음. 시간 동기화가 되지 않아 발생하는 Data Inconsistency는 램포트 시계를 포함한 프로토콜로 해결할 수 있지만, 적절한 프로토콜이 수립되어야 의미가 있음. 3.1 이중화 된 데이터베이스 문제 분산 시스템에서 시간 동기화를 알아보기..