Golang/etc (13) 썸네일형 리스트형 tcp/ip -10 멀티프로세스 기반의 서버 구현 다중 접속 서버 : 여러 클라이언트들에게 동시에 서비스를 제공할 수 있는 프로그램 구현 방법 1. 멀티프로세스 기반 서버 : 다수의 프로세스를 생성하는 방식으로 서비스 제공 2. 멀티플렉싱 기반 서버 : 입출력 대상을 묶어서 관리하는 방식으로 서비스 제공 3. 멀티 쓰레딩 기반 서버 : 클라이언트의 수만큼 쓰레드를 생성하는 방식으로 서비스 제공 프로세스란? 메모리 공간을 차지한 상태에서 실행중인 프로그램 프로그램을 실행시키면 메인 메모리로 이동해서 실행할 준비를 마치게 됨 -> 이때부터 프로세스라 부를 수 있음 이 프로세스에 번호를 매긴 것이 ProcessID = pid * fork 함수 호출을 통한 프로세스 생성 - fork함수는 호출한 프로세스의 복사본을 생성한다. 이미 실행중인 프로세스가 부모 프로.. tcp/ip - 09 소켓 옵션 소켓의 옵션은 계층 별로 분류할 수 있다. IPPROTO_IP : IP 프로토콜에 관련된 사항들 IPPROTO_TCP : TCP 프로토콜에 대한 사항 SOL_SOCKET : 소켓에 대한 가장 일반적인 옵션들 거의 모든 옵션은 설정 상태의 참조(GET) 및 변경(SET)이 가능하다. 하지만 SET이 불가능한 경우도 있는데, 그 대표적인 예가 바로 SO_TYPE 이다. 소켓의 타입은 소켓 생성시 한 번 결정되면 변경이 불가능 하다. 소켓 버퍼와 관련있는 소켓 옵션들 - SO_RCVBUF : 입력버퍼의 크기와 관련된 옵션 - SO_SNDBUF : 출력버퍼의 크기와 관련된 옵션 -> 두 옵션을 이용해서 입출력 버퍼의 크기를 참조할 수 있음. 하지만 TCP 프로토콜에서 입출력 버퍼의 중요성은 엄청 크기 때문에, .. tcp/ip -08 DNS DNS (domain name system) 서버 마다 할당 된 ip 주소를 매번 외우는 것이 쉽지 않기 때문에, domain name이라는 사람들이 기억하기 쉬운 이름을 ip 주소에 할당한다. 바로 이 domain name과 ip주소 사이에서의 변환을 수행하는 프로그램이 DNS이다. 도메인 이름은 해당 서버에 부여된 가상의 주소이므로 실주소로 변환 후 해당 서버에 접속이 가능하다. * 인터넷 브라우저에 domain name을 입력하면 일어나는 일 1. 인터넷 브라우저에서 DNS 서버에 접속한다. -> 해당 domain name에 대한 IP정보를 얻어온다. -> 얻어온 실주소를 통해 해당 서버에 접속한다. 네트워크를 거대한 인터넷 망에 연결하도록 돕는 것이 gateway * 데이터를 전송한다고 하면 그 .. tcp/ip - 07 소켓의 종료 tcp 프로토콜에서는 소켓의 종료과정이 명확하게 이루어져야 한다. 그렇지 않으면 양방향 통신을 하고 있는 두 호스트 사이에서 데이터의 손실등의 문제가 발생할 수 있다. 리눅스의 close함수는 소켓의 완전 종료를 의미하는데, 이렇게 되면 데이터 송수신이 다 완료되지 않았는데 소켓이 먼저 닫혀버리는 상황이 발생 할 수 있다. -> 데이터 소멸 위험 따라서 이를 해결하기 위해서는 half-close, 즉 한 방향의 스트림만을 종료시키는 과정이 필요하다. *Stream? 소켓을 통해 두 호스트가 연결되면 그 다음부터는 상호간의 데이터 송수신이 가능한 상태가 됨 -> 스트림이 형성된 상태 연결 종료 시에 위 그림처럼 생성된 입출력 스트림 중 하나만 연결을 끊는 것을 half-close라고 한다. Half-clo.. golang udp example chapter 6에서 upd 서버와 클라이언트 프로그램에 대해 공부했으니, 코드를 예시로 작성해봤다. 먼저 server.go package main import ( "fmt" "log" "net" ) func handleUDPConnection(conn *net.UDPConn) { buffer := make([]byte, 1024) // udp connection으로 부터 값을 읽어들인다. n, addr, err := conn.ReadFromUDP(buffer) if err != nil { log.Fatal(err) } // 리턴 값은 전달 받은 클라이언트 서버의 address, msg fmt.Println("UDP client : ", addr) fmt.Println("Received from UDP .. tcp/ip 05 tcp의 이론적인 내용을 총 정리하고 넘어가는 강. tcp의 내부 동작 원리가 어떻게 이루어지는지 정리해보고자 한다. 먼저 세 단계로 나누어서 설명해볼 수 있다. 1. 상대 소켓과의 연결 2. 상대 소켓과의 데이터 송수신 3. 상대 소켓과의 연결 종료 세 단계를 거쳐 tcp 의 내부 동작을 이해할 수 있다. tcp는 기본적으로 데이터 손실 없이 신뢰성을 보장하는 연결을 지향한다. 그렇기 때문에 양쪽 호스트 상호간의 확인 작업이 필수적으로 이루어진다. 1. 연결 1. host A에서 연결 요청을 전송 2. host B에서 연결 준비가 되었음을 응답 3. host A에서 연결 준비 데이터 수신 완료를 확인 이 세 과정을 거치기 때문에 3way handshaking이라고 부른다. 2. 데이터 송수신 1. 데이.. tcp/ip 04 tcp/ip 프로토콜 스택: 데이터의 송수신 과정을 네 개의 영역으로 계층화. 상위 ------------------------------------------- 하위 application tcp/ip -02,03 챕터를 두개 같이 포스팅하겠다. 이유는 귀찮기 때문에 ㅎ chapter2. 소켓의 타입과 프로토콜 설정 protocol 이란? -> 대화에 필요한 통신규약, 즉 네트워크 통신에 필요한 규약. 소켓 통신에서는 주로 ipv4 프로토콜 체계가 사용되고 있다. 소켓의 타입에 따라 데이터 전송 방식이 달라진다. 1. 연결지향형 소켓 (SOCK_STREAM) / TCP - 중간에 데이터가 소멸되지 않고 목적지로 전송된다. - 전송순서대로 데이터가 수신된다. - 전송되는 데이터의 경계(Boundary)가 존재하지 않는다. / 데이터를 송수신하는 소켓은 내부적으로 buffer, 즉 바이트 배열을 지니고 있다. 떄문에 데이터가 수신되었다고 해서 바로 read 함수를 호출해야 하는 것은 아니다. - 데이터의 확인 절차가 .. tcp/ip - 01 윤성우의 열혈 tcp/ip 소켓프로그래밍을 보며 공부하고 쓰는 블로그 참고로 이 책은 술먹고 쿠팡에서 산건데 여튼 술에 취한내가 저지른 일을 감당하고자 블로깅까지 해본다. 누구 보라고 쓰는건 아니고 나중에 까먹지 말자고 정리 차원에서 쓰는 블로깅이 될 것같다. 이 책의 가장 처음에서는 소켓이 무엇인지, 서버-클라이언트 소켓 통신이 무엇인지 설명하고있다. 그리고 c언어 코드로 구현되고 있는데, 나는 이걸 최대한 golang으로 바꿔서 작성하는식으로 공부해보고자 한다. 먼저 용어 정리 - socket : 서로 멀리 떨어져 있는 host간에 데이터를 주고 받을 수 있도록 네트워크 망에 연결시키는 창구 운영체제에서 제공을 하고 있다. 이 책에서는 socket 통신을 전화기의 작동 원리에 빗대어 표현하고 있다. .. Golang Apple Login (애플 로그인) 전 포스팅에서 열심히 jwt, jwk 에 대해 설명했으니 이제 코드로 직접 구현하는 법을 작성하겠다. 글쓴이가 아주아주 귀찮은 관계로 서버가 로그인하여 애플 인증서버로 부터 - state - code - id_token 값을 이미 받았다는 전제하에 포스팅을 할 예정이다. 이전 단계는 다른 oauth2.0 로그인 방식과 똑같기 때문에 생략. type authResponse struct { State string `query:"state"` Code string `query:"code"` IdToken string `query:"id_token"` } reqAuth := authResponse{} if err = c.Bind(&reqAuth); err != nil { if uri := c.Request()... 이전 1 2 다음