ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네트워킹 기초
    @ 16. 1 ~ 17. 1/네트워크 프로그래밍 2016. 12. 5. 23:43

    tcp / ip를 먼저 알기 위해서는 프로토콜을 알아야 한다.

    기본적으로 규정을 이야기하는데 약속 이라고도 한다.



    스트림....네트워크에서는 보낸 개수랑 받는개수가 틀리수도 시작이 데이터가 틀릴 수도..데이터의 끝이 틀릴 수도..

    패킷 : 인터넷 표준에서 주고 받는 데이터 단위(스트림이나 메시지는 패킷이라는 것으로 쪼개지고 조립되는 과정이 반복됨..)


    레이턴시 : 전송되는 데이터가 목적지에 도착하는데 걸리는 시간

    네트워크 통신을 하기 위한 것..


    UDP : 사용자가 정의한 메시지를 전송하는 통신규약..

    다대다 통신가능..패킷 드랍이 발생했을때 운영체제가 재송신을 해주는 일이 없음..멀티미디어나 통신 게임 등에서 이 프로토콜 사용

    기관총 ㄴ난사 케릭터 이동 같은것 빼고는 다 TCp


    TCP : 전송 제어 프로토콜, 연결 지향형(반드시 논리적으로 연결이 되어야 한다. UDP는 연결안되어도 됨)

    일대일 통신만 가능, 보내는 데이터는 반드시 상대방에게 도달함..스트림 형태로 데이터가 전송

    패킷 드랍이 발생하면 운영체제가 알아서 재송신을 통해 반드시 상대에게 스트림이 모두 도착하게 됨..





    소켓 : 네트워크를 통한 두 컴퓨터의 연결을 의미

    소켓은 서버 소켓 클라이언트 소켓으로 나뉜다.


    서버 소켓순서는 1. socket 생성, 2. bind (전화기 가설용도? IP주소와 PORT할당), 3. listen(요청을 받을 수 있는 상태로 변환), 4.accept(요청을 수락할떄사용)


    클라 소켓순서는 1. connent(연결요청) 2. closesocket(소켓 닫기)


    send, recv 파일 입출력 관련


    프로토콜 : 컴퓨터 상호간의 대화에 필요한 통신규약

    소켓의  데이터 전송방식 2가지

    1. 연결지향형 소켓 (SOCK_STREAM) 이걸 TCP라고 한다.

    컨베이어 벨트 같은 개념?? 중간에 데이터가 소멸되지 않고 목적지로 전송

    전송 순서대로 데이터가 수신, 전송되는 데이터의 경계가 존재하지 않는다.

    (소켓 내부적으로 버퍼가 있는데 이 버퍼에 가득 찼을때까지 기다렸다가 recv 함수를 호출하거나 또는 즉각즉각 호출하거나..그래서 경계가 없다는것)

    (write와 recv의 숫자가 일치할 필요가 없다)

    근데 그 버퍼가 가득차면 데이터는 계속 전송될까? 아니다 데이터를 전송하는 소켓이 더이상 데이터를 전송하지 않는다.

    반드시 1:1이어야 한다


    2. 비연결지향형 소켓(SOC_DGRAM) 이걸 UDP라고 한다.

    엄청나게 빠른 오토바이 택배 아저씨를 생각하면됨

    전송순서 없이 가장 빠르게 전달함. 물건이 그럼 파손될 우려가 있지? (데이터 손실 우려가 있다)

    그리고 오토바이에 실어서 보낼 수 있는 크기도 제한되지?(이건 한번에 전송할 수 있는 데이터의 크기가 존재함)

    연결 이라는 개념이 없다.



    IP : 인터넷상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값

    PORT는 컴퓨터가 아니다 프로그램상에서 생성되는 소켓을 구분하기 위해 소켓에 부여되는 번호를 뜻한다.



    네트워크를 구성하려면 외부로부터 수신된 데이터를 호스트에 전달하고 호스트가 전달하는 데이터를 외부로 송신해주는 물리적 장치가 필요

    이를 가리켜 라우터 또는 스위치라고 한다. 이것도 근데 그냥 컴퓨터에 지나지 않음(사실 지금 이 노트북에 소프트웨어만 깔면 라우터 됨..

    그리고 스위치는 라우터보다 기능이 작은것인데..보통은 둘이 같다고 한다)


    근데 IP만 가지고는 최종 목적지인 응용프로그램에 도달하지 못한다..

    PORT 번호의 소켓에 운영체제가 전달해줘야한다. 결국 포트는 운영체제 내에서 소켓을 구분하는 목적으로 사용된다.

    동일한 포트란 없다.근데 ..TCP와 UDP 소켓은 포트번호를 공유하지 않는다. 그래서 중복되어도 상관없음..Tcp 1111 UDP1111 공유안함 상관없음


    빅 엔디안 네트워크 바이트 순서

    리틀 엔디안 인텔계열 바이트 순서

    (근데 자동으로 다되서..sockaddr_in 구조체 변수에 데이터를 채울 때 말고는 신경안써도됨)


    루프백 주소란 자기 자신의 PC를 가리키는 가상의 인터넷 주소(127. 0. 0. 1)이다.

    자신의 PC내에서 네트워크트래픽을 전송하거나 수신하려고 할때 사용함..


    TCP / IP 프로토콜 스택

    어플리케이션 계층

    TCP     |     UDP 계층

      IP계층

     LINK계층

    TCP / UDP 소켓 생성 후 데이터 송수신하려면 4개의 계층 도움을 받아야 한다.

    4. LINK 계층 : 물리적인 영역의 표준화에 대한 결과 LAN, WAN 등과 같은 네트워크 표준과 관련된 프로토콜을 정의

    3. IP계층 : 데이터를 전송할 경로를 선택해줌 근데 여긴 굉장히 경로가 일정치 않아서 손실이 생김..

    2. TCP 계층 : TCP가 데이터를 보낼때 기반이 되는 프로토콜이 IP인데(스택의 구조로 계층) 

    TCP가 분실된 데이터에 재전송해줌으로써 IP에 신뢰성을 부여하게 됨..


    3핸드 쉐이킹 4핸드 ㅜ쉐이킹...조




    UDP 소켓! 

    우체통봐라 한번 넣으면 상대방의 수신여부를 확인할 길이 없다..ㅠ..이거와 비슷..

    신뢰성만 봤을땐 Tcp가 더 좋긴함....으

    흐름제어가 여긴 없어서..신뢰성이 없음..TCP에 흐름제어 빼면 남는게 없음..

    UDP의 역할중 가장 중요한것..호스트로 수신된 패킷을 PORT정보를 참조하여 최종 목적지인 UDP소켓에 전달한다..

    UDP에서는 tcp과정의 listen / accept 함수의 호출이 불필요하다 그리고 서버건 클라건 하나의 소켓만 있으면됨..

    편지의 예로 우체통 하나만 있으면됨..ㅎㅎ

    하나으 ㅣ소켓으로 둘이상의 호스트와 연결이 됨~




    DNS서버에서 www.naver.com란 이름을 IP주소로 변경이 된다.




    멀티플렉싱 : 하나의 통신채널을 통해서 둘 이상의 데이터(시그널)를 전송하는데 사용되는 기술

    물리적 장치의 효율성을 높이기 위해서 최소한의 물리적인 요소만 사용해서 최대한의 데이터를 전달하기 위해 사용되는 기술

    ㅋㅋ 컵전화기를 3명이서 한다고 하면 각 1개씩 준비한다면 총 컵은 6개 실은 3개인데

    그걸 컵3개 준비하고 실을 가운데 묶어서 준비하면? 이런게 멀티플랙싱의 정의임..

    접속하는 클라이언트 수와는 상관없이 프로세서가 딱 하나임..(멀티플렉싱이 아니라면 프로세서가 클라마다 생겨야함..)



    멀티캐스트

    만약에 가입자중 1000명이 서비스 요청하면 1000명에게 10000은? 10000명에게 데이터를 전송해야하는데..

    TCP기반이라면..1000명의 클라에 ?1000개의 소켓 연결 유지..10000이란면??똑같다..

    UDP라면? 소켓은 적더라도...결국 1000회 10000회 데이터 전송이 필요한것이다. 

    결국 다수의 클라이언트에게 동일한 데이터를 전송하는것은 서버와 네트워크 트래픽 측면에서 부정적이다.

    그래서 이걸 해결하기 위해 멀티 캐스트라는게 있다.


    이건 우선 UDP기반으로한다. 그래서 UDP 서버 / 클라 구현과 비슷하다.

    차이는 UDP에서는 데이터 전송은 하나의 목적지를 두고 이뤄지지만 멀티캐스트에서는 데이터 전송은 특정 그룹에 가입되어 있는

    다수 호스트가 된다. 즉, 멀티캐스트 방식을 이용하면 단 한번에 데이터 전송으로 다수의 호스트에게 데이터를 전송할 수 있다.


    ㅋㅋ 그러니까

    멀티캐스트 서버에서 특정 멀티캐스트 그룹을 대상으로 데이터를 딱 한번! 전송한다.

    그러면 그룹에 속한 클라는 모두 데이터를 수신하게 된다! 우와!!

    음..그리고 

    일반적인 UDP패킷과 달리 하나의 패킷만 네트워크상에 띄워 놓으면 라우터들은 이 패킷을 복사해서!! 다수의 호스트에게 전달!

    라우터의 도움이 크다 ㅎ

    야 근데 복사되는거봐 트래픽 큰거 아니냐?? 하지만.. 하나의 영역에 동일한 패킷이 둘 이상 전송되지 않는다?

    결론..

    TCP나 UDP 방식은 1000개의 호스트에 파일 전송하려면 1000회 파일을 전송해야한다. 열개의 호스트가 하나의 네트워크로 묶여있어도 말이다..

    멀티캐스트는? 한번 전송이다..1000개의 호스트를 묶고 있는 라우터가 1000개의 호스트에게 파일을 복사해 줄 테니 말이다..



    브로드 캐스트

    한번에 여러 호스트에게 데이터를 전송한다는 점에서 멀티캐스트와 유사하다..

    그러나 전송이 이뤄지는 범위에서 차이가 난다.


    오늘은 데이타 전송방식에 따른 유니캐스트 트래픽 과 브로드캐스트 트래픽 및 멀티캐스트 트래픽들의

     

    차이점에 대해살펴보겠습니다.

     

     

    그림1)을 보시면 왼쪽에 있는 서버가 특정한 하나의 PC에게만 트래픽을 전송합니다.

     

    즉.유니캐스트란 이처럼 트래픽을 전송할 호스트가 한명일 경우에 해당하며, 

     

    우리가 친구와 전화통화하는것도 마찬가지로 유니캐스트 트래픽입니다.

     

    이번엔 그림2)을 살펴보겠습니다.

     

    그림2)을 보시면 서버가 하나의 트래픽을 보냈는데 물리적으로 연결 네트워크장비들(스위치 허브 등)

     

    에의해 여러개의 복사된 트래픽이 해당 동네(네트웍)에 모든PC들에게 전송되고있습니다.

     

    이처럼 브로드캐스트 트래픽은 해당 동네(네트웍)에 있는 모든 HOST들에게 트래픽을 전송할때 사용합니다.

     

    브로드캐스트는 한 아파트 내에서 전체방송을 하는것과 동일합니다.

     

    예를 들어 101호에 사시는  모모 씨가 차를 잘못 Parking했다고 가정해봅시다.

     

    경비실 아저씨가 101호 직접 연락을 취하게 되면 앞서본 유니캐스트에 해당하겠지만 부재중이라 가정한다면

     

    현재 아파트(네트워크)내 에 차가있으므로 그분을 찾는 전체방송을 보내는게 바로 브로드캐스트입니다.

     

    이렇게 된다면 전체방송을 들은 아파트 입주민들은 어떻케 대처 할까요?

     

    방송(브로드캐스트)를 들어본후 자신이 해당사항이 없으면 한던일(??)을 계속 하겠죠..

     

    하지만 101호 아저씨가 이 브로드캐스트 방송을 듣는다면 빨리 나가서 차를 다시 Parking 해야할것입니다.

     

    이처럼 브로드캐스트 트래픽의 특징은 수신자에 의지와 상관이 없습니다.(방송을 듣고 싶다고 듣고 듣기 싫타고

     

    듣지않고 이런개념이 아니죠 ^^)

     

    또 방송(브로드캐스트)이 나오면 모든 입주민들(해당 네트워크의  HOST들)은 자신이 해당되는지 여부를 판단해야

     

    합니다.

     

    네트워크에서 이처럼 브로드캐스트 트래픽이 중요한 역활을 하지만 한네트워크 내에 브로드캐스트 트래픽들이

     

    많이 돌아다니면 네트워크 성능이 심각하게 떨어집니다.

     

    방송(브로드캐스트)이 끊임없이 온다고 생각해보세요 ^^;;

     

    또 네트워크에서 브로드캐스트 개념은 PC의 인터럽트 개념과 비슷하기도 합니다.

     

    PC에 인터럽트가 걸리면 한던 일을 멈추고 해당 인터럽트를 최우선으로 처리를 합니다.

     

    실제 우리가 통신을하는데 필요한 많은 어플리케이션들(게임,메신져등등)브로드캐스트 트래픽을 많이 발생시킵니다.

     

    이 브로드캐스트 트래픽을 제어 하는 방법이 스위치에서는 VLAN이라는 개념입니다.(라우터는 특정 인터페이스에서

     

    수신한 브로드캐스트 트래픽을 다른곳으로 넘기지 않습니다)

     

    이번엔 멀티캐스트 트래픽을 살펴보겠습니다.

     

    먼저 그림3)을 보세요

     

     

    그림3)을 보시면 서버가 트래픽 복사본을 특정 PC 두 곳에만 전송을 하며, 중앙에 있는 PC에게는 트래픽을

     

    전송해주지 않고 있습니다.

     

    멀티캐스트 트래픽은 요청이 있는 Host들에게만 물리적을 연결된 네트워크장비(라우터,스위치등)이

     

    전송을 해줍니다.

     

    앞서 배운 브로드캐스트랑 비교를 해보면 수신자의 의지가 반영되는게 서로 다른 차이점이라고 할수있습니다.

     

    즉.멀티캐스트 프레임은 해당 네트워크에 속한 모든 Host들에게 전송하는 브로드캐스트랑 달리

     

    요청이있는 특정 Host들에게만 전송을 하는 방식입니다.

     

    멀티캐스트 전송방식은 수강신청하는 것과 아주 흡사합니다.

     

    ▷개설강좌 수강신청(Join 메세지)

     

    ▷수강정정 또는 수강포기(leave 메시지)

     

    ▷수강신청툴(IGMP)

     

     예를 들어서 수강신청툴(IGMP)을 이용해서 개설 강좌(멀티캐스트 방송)를 수강신청(Join 메시지)한 사람만 수업을

     

    들을수있겠죠 ^^

     

    만일 더이상 그만 듣고 싶으면 수강정정 이나 수강포기(Leave메시지)보내면 더이상 해당 호스트로 방송이 나가지 않습니다.

     

    실제 우리가 웹상에서 실시간의 보는 TV프로그램 이나 축구경기는 멀티캐스트로 전송을 해줍니다.

     

                             

     

    앞으로 칼럼에 더 신경을 많이 쓸테니 많은 관심부탁드립니다.

     

    이상 아더였습니다. 좋은 하루되세요~~~



    쓰레드 동기화의 두가지 측면이 있다.

    1. 동일한 메모리 영역으로의 동시 접근이 발생한 상황

    2. 동일한 메모리 영역에 접근하는 쓰레드의 실행순서!! 실행순서가 중요하다!!


    A 스레드가 실행되고 끝나면 b가 되고 b끝나면 다시 A 이런 실행순서!


    임계영역은 넓게...lock unlock 비용심하네..


    윈도우 운영체제가 생성해서 관리하는 리소스들의 메모리 블럭..(커널 오브젝트)


    프로그램이 시작될때 main함수를 호출하는 주체는 프로세서가 아니라 쓰레드다!!!!!!!쓰례뜨!!!!!!!


    우리가 흔히 보는 waitforsingleobject함수 있지 이거 잠깐 최초에 커널 오브젝트가 초기에는 non - sigbaled 상태야

    그런데 이벤트가 발생되면 signaled상태로 변해 그리고 저기 waitforsingboejct함수에 의해서 반환되면 다ㅣ non상태로 변경해준데

    위에 다 틀림..아래가 맞음 ㅠㅠ


    1) Signaled
    2) NON - Signaled

    커널 오브젝트는 커널 리소스의 타입에 따라 다양하게 구성되어 있다고 얘기하였다.
    커널 오브젝트의 상태 역시 타입에 따라 Signaled <-> NON - Signaled 상태 전이의 시점이 다르다.

    이 상태를 감시할 수 있는 함수가 바로 WaifForSingleObject / WaitForMultipleObject 이다.

    위 함수들은 커널 오브젝트가 NON - Signaled 상태에선 Blocking 되어 있다가, Signaled 상태가 되면 함수를 빠져 나온다.

    프로세스 커널 오브젝트의 경우엔 Signaled <-> NON - Signaled 상태 전이가 다음과 같이 이루어진다.

    1) 프로세스 실행 중 : NON - Signaled
    2) 프로세스 종료시 : Signaled



    유저 모드 커널모드 

    유저모드 : 응용 프로그램이 실행되는 기본 모드, 물리적인 영역으로의 접근이 허용되지 않는다. 접근할 수 있는 메모리의 영역에도 제한이 따름

    커널모드 : 운영체제가 실행될 때 모드로, 메모리 뿐만 아니라, 하드웨어의 접근에도 제한이 따르지 않는다.


    즉, 유저는 응용프로그램의 실행모드

    커널은 운영체제의 실행모드


    하지만 응용 프로그램의 실행과정에서 윈도우 운영체제가 항상 유저모드에만 머무는 것이 아니라, 유저 모드와 커널모드를 오가며 실행하게 된다.

    예를들어 여러분은 윈도우상에서 쓰레드를 생성할 수 있다. 물론 쓰레드의 생성요청은 응용 프로그램상에서 함수 호출로 이뤄지지만,, 쓰레드를 실제로 생성하는건 운영체제임.. 결국 커널 모드로의 전환이 불가피하넋..


    구분이유? 안정성때문에..포인터봐라 막 접근하잖아..






    동기화와 비동기화 --------------------------------------------------------------------------------------------------



    일단 동기화에 대한 설명

    1. 동기화란 일단 실행순서의 동기화 개념으로 이해하면 편하다.

    2. 간단히 설명하자면 함수는 함수내의 연산이 끝나기 전에는 함수는 반환되지 않는다.

    3. 단순하게 본다면 당신의 프로그램은 정지한다. (물론 파일을 읽어오는 연산을 열심히 하고 있기는 하겠지만.)

    4. 10기가짜리 파일을 읽어오는 연산은 10분이 걸린다고 치자. 10기가짜리 파일을 처음부터 끝까지 다 읽어야 함수가 반환된다.

    5. 당신의 컴퓨터는 10분동안 정지한다.  블로킹 모드라 ㅗㅎ자


    그렇다면 비동기화란?

    1. 비동기화란 하나의 실행흐름을 또 만들어내는 작업이라고 생각해보자. 그리고 그것을 OS에서 지원해준다고 생각해보자.

    2. 10기가짜리 파일을 읽어오는 연산은 10분이 걸린다고 치자. 10기가짜리 파일을 처음부터 끝까지 다 읽어야 함수가 반환된다.

    3. 당신의 컴퓨터는 CPU에 파일을 읽어오는 연산에 대한 명령을 내린다.

    4. 당신의 컴퓨너는 한편으로는 10기가짜리 파일에 대한 입출력 연산을 하면서 동시에 당신의 프로그램또한 실행시킬 것이다.

    5. 10기가짜리 파일 입출력과 이후의 프로그램은 함께 실행될 것이다.


    넌 블로킹 모드 

    이해가 가는가?


    Asynchronous(비동기) Notification(알림) IO 방식 ---------------------------------------------------------------------


    비동기로 알림을 처리한다?

    무슨 말인지 선뜻 이해가 안간다면 RECV와 함수를 좀더 생각해 보자.

    RECV함수는 한번 실행되면 신호가 있건 없건 연락이 올때까지 무한정 기다린다.

    하지만 이것을 자신의 입력버퍼에 데이터가 있을때만 체크해준다면 좀더 중간중간의 입출력에 관련된 작업에 효율을 기할 수 있지 않을까?

    즉 상대가 데이터를 분명히 보내서  꼭 필요할때만 RECV함수를 호출할 수 없는가? 라는 것이다.

    이러려면 소켓의 상태를 파악해줄 방법이 필요하다. 이에 대한 방법으로는 2가지 방법이 가능한다.



    Overlapped IO 란? -------------------------------------------------------------------------------------------------------

    앞서 비동기화된 알람방식에 대해서 알아봤다면 이번에는 IO작업 자체의 비동기 방식에 대해서 알아볼 차례이다.

    비동기 방식의 소켓전송이란 여러개의 소켓이 동시에 IO작업을 처리하는 것을 의미한다.

    여러개의 쓰레드나 비동기 시스템을 통해서 여러개의 파일을 동시에 읽어들이는 것과 동일하다고 보면 된다.

    시스템 프로그래밍과 어느정도 겹치는 부분이 있지만. 비동기 방식은 다음의 함수들이 필요하다.


    IOCP란? -------------------------------------------------------------------------------------------------------


    소켓통신이란 일반적으로 정해진 통신규약이고 운영체제도 그에 따르고 있다. 

    즉 윈도우와 리눅스방식이 현재까지 크게 다르지 않았던 이유는 운영체제의 특징적인 부분보다는 기본적인 규격을 지키는 방식을 사용했기 때문이다.

    하지만 운영체제란 분명히 그에 맞는 특색이 있고 특색에 따라서 더 많은 것을 지원해 줄수 있을 것이다.


    IOCP란 윈도우에서 지원해주는 비동기 통신방식을 의미한다. 설명을 하자면 다음과 같은 방식을 가지고 있다.


    1. 비동기방식을 사용하는 소켓을 다수 생성한다.

    2. 쓰레드를 통해서 소켓에 발생하는 이벤트를 병렬 관찰 한다.

    3. 각각의 소켓은 비동기로 입출력을 실행한다. 


    종합 -> 즉 다수의 소켓이 다수의 쓰레드에 의해서 관리 받으며 비동기로 데이터 송수신을 하게 되는 구조를 의미한


    http://blog.naver.com/PostView.nhn?blogId=ssmileh&logNo=120004724378

    정말 좋은 iocp설명 블ㄹ그다


    작업의 시작은 비동기..결과를 받는 부분은 동기화가 되어야 한다...



    좀더 자세히 설명하자면 먼저 IOCP 객체가 별도로 생성되어야 한다. 그 다음에 이 객체와 입출력 객체 중의 하나가 연결되어야 한다. 다음으로 이 입출력 객체에 비동기 I/O 작업이 수행되면 운영체제가 이 큐에 그 비동기I/O의 결과를 집어넣게 된다.



    또한 이 큐는 하나 이상의 스레드와 연관지어지게 된다 (스레드의 수는 비동기 I/O의 특성에 따라 달라지게 된다. 만일 I/O가 오래 걸리는 것이라면 스레드의 수는 적어도 관계없다. 하지만 I/O가 시간이 아주 조금밖에 안 걸리는 것이라면 스레드의 수는 많아야 한다). 운영체제는 큐에 결과가 있고 관련 스레드들 중에서 놀고 있는 놈이 있으면 그 스레드가 결과를 받아서 다음 작업을 수행할 수 있게 해준다. 즉, IOCP와 관련되어 동작할 수 있는 스레드를 미리 여러 개 만들어 놓고 이 중에서 필요에 따라 놀고 있는 것을 가져다 큐에서 비동기 I/O 결과를 읽어가도록 하는 것이다. 참고로 한 IOCP 객체는 동시에 여러 입출력 객체와 연관지어질 수 있다.

     IOCP 큐안에 읽어들일 비동기 I/O 결과가 있으면 이를 읽어가지고 리턴한다. 읽어올 것이 없으면 읽어올 것이 생길 때까지 리턴하지 않는다. 다음 코드처럼 이 함수는 무한루프안에서 계속적으로 호출되는 것이 일반적이다.

    [출처] IOCP란...|작성자 ssmileh


    [출처] IOCP란...|작성자 ssmileh

    [출처] IOCP란...|작성자 ssmileh




    웹서버란 HTTP 프로토콜 기반으로 웹 페이지에 해당하는 파일을 클라이언트에게 전송하는 역할의 서버

    어플리케이션 레벨의 프로토콜이다.

    (HTTP는 HYPERTEXT TRANSFER PROTOCOL의 약자이며 클라이언틔 선택에 따라서 이동이 가능한 조직화된 정보이다)


    즉, TCP / IP를 기반으로 구현된 프로토콜이기 떄문에 우리도 HTTP를 직접 구현할 수 있다. 결과적으로 웹 서버를 구현하는 것이 된다.

    참고로 인터넷ㅂ ㅡ라우저도 소켓 기반의 클라이언트 프로그램이다. 


    서버는 클라이언트의 요청에 응답하고서는 연결을 바로 끊음을 알 수 있다. 즉 서버는 클라이언트의 상태정보를 유지하지 않는다.

    (웹페이지 로딩 후 인터넷이 안되도 떠있는..그런건가?)


    그래서 인지 앞서 요청했던 클라이언트가 다시 요청을 해와도 이 클라이언트가 조금 전에 한 차례 요청을 했던 클라이언트임을 인식하지 못한다.

    다만 새로운 요청에 대해서 동일한 형태로 응답할 뿐..

    그래서 상태가 존재하지않은 프로토콜이라고 한다.

    ㅋㅋ 이런 연결상태가 유지되지 않는것 떄문에 쿠키와 세션이라는 이름의 기술이 있다. 

    (인터넷 쇼핑몰에 보면 장바구니 기능의 예..장바구니에 담긴정보는 브라우저를 종료시킨 다음에도 계속 유지되지? 이렇게 상태정보의 유지가 가능한것..)


    클라이언트가 웹 서버에 보내는 요청 메시지가 어떻게 구성되어있나..

    요청 라인

    메시지 헤더

    //공백

    메시지 몸체(POST방식으로 요청시에만 삽입)

    이렇게 구서되어있는데.여기서 요청라인..GET은 주로 데이터를 요청하는 경우...POST는 데이터를 전송하는 경우....


    반대로 서버가 클라에게 보내는 응답메시지..

    상태라인

    메시지헤더

    //공백

    메시지 몸체


    웹 서버는 HTTP프로토콜 기반으로 하기 때문에 IOCP의 모델을 적용한다고해서 많은 이점을 얻을 수 있는 것은 아니다.(물론 이점이 있긴한ㄴ데..)

    클라이언트와 서버가 한번씩 데이터를 주고받은 후 연결을 끊어버리는데..IOCP의 실력발휘 시간이 없을텐데...

    '@ 16. 1 ~ 17. 1 > 네트워크 프로그래밍' 카테고리의 다른 글

    DB란 무엇인가  (0) 2017.01.04
    http 프로토콜 요청 / 응답  (0) 2016.12.08
Designed by Tistory.