10월 28, 2016

HTTP


HTTP (HyperText Transfer Protocol)

WWW 상에서 정보를 주고 받을 수 있는 프로토콜로 HTML 문서 및 다른 종류의 데이터를 주고 받는데 사용. TCP, UDP 방식을 사용하며 80번 포트를 이용함. 버전 0.9, 버전 1.0 및 버전 1.1이 존재하는데 현재 대부분 버전 1.0 이나 버전 1.1을 사용함. HTTP/2를 개발 중.

HTTP는 클라이언트와 서버 사이의 요청/응답(request/response) 프로토콜로 요청 메시지, 응답 메시지가 각각 구분되어 있으며 이에 따라 공통으로 사용되는 헤더와 request 헤더, response 헤더가 존재함. 먼저 클라이언트가 서버에 연결을 요청하면 Connect, Request, Response, Close 과정을 거쳐 통신을 수행함. 버전 0.9 의 경우 같은 페이지 내에서도 요소마다 Connect와 Close 과정을 거쳐서 효율이 매우 떨어졌지만, 버전 1.0 부터 한번의 Connect 후에 Request와 Response를 반복할 수 있게 됨.


HTTP Request

HTTP Request |devwoodo's blog

HTTP Response

HTTP Response |devwoodo's blog

reference

HTTP Response


내용

HTTP Response 는 HTTP Request 에 대한 응답 패킷. 서버에서 쓰이고 있는 프로토콜 버전, Request에 대한 실행 결과 코드(HTTP Status code), 간략한 실행 결과 설명문(OK 등)이 담겨 있으며, 전달할 데이터 형식, 데이터 길이 등 추가 정보가 MIME 형식으로 표현되어 있음. 그리고 헤더 정보 뒤에는 실제 데이터가 담겨 있음.


HTTP Status code (HTTP Response의 실행 결과 코드)

1XX (조건부 응답)

요청을 받았으며 작업을 계속함을 의미.

2XX (성공)

클라이언트의 요청을 수신하여 이해하고 승낙했으며, 성공적으로 처리했음을 의미

  • 200(Ok)
  • 201(Create)
  • 202(Accepted)
  • 203(Non-Authoritative Information)
  • 204(No Content)
  • 205(Reset Content)
  • ...

3XX (리디렉션 완료)

요청을 마치기 위해 클라이언트가 추가 동작을 취해야 하는 경우


4XX (요청 오류)

클라이언트에 오류가 있는 경우

  • 400(Bad Request) : 서버가 요청의 구문을 인식하지 못함
  • 401(Unauthorized) : 이 요청은 인증이 필요함
  • 403(Forbidden) : 서버가 요청을 거부함
  • 404(Not Found) : 서버가 요청 받은 페이지를 찾을 수 없음
  • 405(Method Not Allowed) : 요청에 지정된 방법을 사용할 수 없음
  • 406(Not Acceptable)
  • 408(Request Timeout) : 서버의 요청대기가 시간을 초과함
  • ...

5XX (서버 오류)

유효한 요청을 서버가 명백히 수행하지 못했음을 의미

  • 500(Internal Server Error) : 서버에 오류 발생해 요청을 수행할 수 없음
  • 501(Not Implemeted) : 서버에 요청을 수행할 수 있는 기능이 없음. ex) 서버가 요청 메소드를 인식하지 못할 때
  • 502(Bad Gateway) : 잘못된 응답을 받음
  • 503(Service Unavailable) : 서버가 오버로드 되거나 유지 보수를 위해 다운됨. 대게 일시적인 상태
  • 504(Gateway Timeout) : 제 때 응답을 받지 못함
  • ...

reference


HTTP Request


크게 GET, POST, 기타 방식이 존재


GET

가장 일반적인 HTTP Request 방식으로 요청 데이터에 대한 인수를 URL을 통해 전송함. URL에 인수가 그대로 나타나기 때문에 보안에 취약한 방식. GET 방식에서는 각 이름과 값을 &로 결함하며 글자수는 255자로 제한됨.


POST

GET과 달리 HTTP 헤더에 데이터를 전송. 내부의 구분자가 각 파라미터(이름, 값 등)를 구분하며, 서버를 이를 해석하며 처리해야하기 때문에 GET 방식보다 상대적으로 처리 속도가 늦음. 많은 양의 데이터를 전송하는 경우 사용.


기타

  • HEAD : 서버 측의 데이터를 요청하고 검색하는데 사용.
  • OPTIONS : 자원에 대한 요구/응답 관계에서 관련된 선택 사항의 정보를 요청할 때 사용.
  • PUT : 메시지에 포함되어 있는 데이터를 지정한 URI에 저장.
  • DELETE : URI에 지정되어 있는 자원을 서버에 지울 수 있게 함.
  • TRACE : 요구 메시지의 최종 수신처까지 루프백 검사에 사용.

reference

10월 21, 2016

Classic RISC pipeline : instruction 실행 순서


5 stage of RISC pipeline

  1. Instruction fetch
  2. The Instruction Cache on these machines had a latency of one cycle, meaning that if the instruction was in the cache, it would be ready on the next clock cycle. During the Instruction Fetch stage, a 32-bit instruction was fetched from the cache.

  3. Instruction decode
  4. Unlike earlier microcoded machines, the first RISC machines had no microcode. Once fetched from the instruction cache, the instruction bits were shifted down the pipeline, so that simple combinational logic in each pipeline stage could produce the control signals for the datapath directly from the instruction bits. As a result, very little decoding is done in the stage traditionally called the decode stage.

  5. Execute
  6. The Execute stage is where the actual computation occurs. Typically this stage consists of an Arithmetic and Logic Unit, and also a bit shifter. It may also include a multiple cycle multiplier and divider.

  7. Memory access
  8. If data memory needs to be accessed, it is done so in this stage.

  9. Write back
  10. During this stage, both single cycle and two cycle instructions write their results into the register file.


reference


const iterator VS const_iterator


  • const iterator
  • const iterator는 iterator를 const로 만듦. iterator는 멤버 필드로 pointer를, 멤버 메소드로 operator++(..), operator+(..) 등의 연산을 가지고 있는 클래스. 이 클래스의 인스턴스에 const를 붙이면 인스턴스 내용을 수정할 수 없게 되므로, 멤버 필드인 pointer를 수정할 수 없게 됨. 즉, const iteratoroperator++(..), operator+ 와 같은 멤버 연산 실행이 불가능. 따라서 container 안에 있는 자료 중 딱 그 하나의 자료만 수정할 때, const iterator를 사용함.

  • const_iterator
  • const_iterator는 클래스 내부의 멤버 필드 pointer가 가르키는 대상의 내용(*pointer)을 수정하는 것을 막기 위해 만든, iterator와는 다른 목적을 가진 클래스. 따라서 const_iteratoroperator++operator+(..) 등 연산을 자유롭게 할 수 있음. container의 자료를 읽기만 가능하게 하려할 때 사용.


요약

  • const iterator : container 안에서 딱 하나의 자료만 수정하려할 때 사용.
  • const_iterator : container 안의 자료들을 읽기 전용으로 불러올 때 사용.

reference

10월 20, 2016

Visual Studio 에서 소스 파일 내 한글 깨짐, 저장 불가 현상


사양

  • Windows10 English -> Korean language pack 설치
  • Visual Studio 2015 community

증상

  • Git에서 remote repos. clone 후 VS에서 열면 소스코드 안의 한글이 모두 깨져서 나옴.
  • VS에서 코드를 작성 시 한글을 사용하면 code page를 949로 변경해야한다는 안내 나오면서 저장이 안됨.

원인

Visual Studio에서 네이티브 프로젝트는 사용자 컴퓨터의 로케일에 맞는 지역 인코딩을 자동으로 설정.


해결방법

  1. Settings(:설정)
  2. 시계, 언어 및 국가별 옵션
  3. 국가 또는 지역
  4. 관리자 옵션 탭
  5. 시스템 로캘을 '한국어'로 변경
cf. 만약 시스템 로캘에 한국어가 뜨지 않으면 시계, 언어 및 국가별 옵션에서 언어 > 언어 추가에 한국어 추가를 시도해 볼 것.

reference

10월 18, 2016

TCP 3-way handshaking, 4-way handshaking

  • SYN : 시퀀스 동기화 요청
  • ACK : 패킷을 받았다는 응답. 다음에 받을 시퀀스 넘버를 가지고 있음.
  • FIN : 연결 종료 요청



3-way handshaking: Connection establishment


  1. Step1
  2. Initiator[CLOSED]가 SYN(To Receiver)를 전송. Initiator는 전송한 SYN(To Receiver)에 대한 ACK를 기다리는 Initiator[SYN-SENT]로 전환.

  3. Step2
  4. Receiver[LISTEN]가 SYN(From Initiator)에 대한 ACK와 SYN(To Initiator)를 전송. SYN(To Initiator)에 대한 ACK를 기다리는 Receiver[SYN-RECEIVED]로 전환. Initiator[SYN-SENT]가 ACK(From Receiver)를 받으면 Initiator[ESTABLISHED]로 전환. 받은 SYN(From Receiver)에 대한 ACK를 전송.

  5. Step3
  6. Receiver[SYN-RECEIVED]가 ACK(From Initiator)를 받으면 Receiver[ESTABLISHED]로 전환. TCP 연결이 확립, 데이터 교환이 가능.



4-way handshaking: Connection termination

세 방향 핸드셰이크는 네트워크로 연결된 미디어를 통해 세 개의 패킷만 전송하면 되지만 이 신뢰성 있는 연결을 종료하려면 네 개의 패킷을 전송해야 합니다. TCP 연결은 데이터가 서로에 관계 없이 각 방향으로 흐를 수 있는 전이중이기 때문에 각 방향으로 개별적으로 전송해야 합니다.


  1. Step1
  2. Terminator[ESTABLISHED]가 FIN(From Terminator)를 전송. FIN(From Terminator)에 대한 ACK를 기다리는 Terminator[FIN-WAIT-1]으로 전환.

  3. Step2
  4. Receiver[ESTABLISHED]가 FIN(From Terminator)에 대한 ACK를 전송. 어플리케이션에게 close 알리고 Receiver[CLOSE-WAIT]로 전환. Terminator[FIN-WAIT-1]은 ACK(From Receiver)를 받으면, FIN(From Receiver)를 기다리는 Terminator[FIN-WAIT-2]로 전환.

  5. Step3
  6. Receiver[CLOSE-WAIT]는 어플리케이션이 close할 준비가 되면 FIN(To Terminator)를 전송. Fin(To Terminator)에 대한 ACK를 기다리는 Receiver[LAST-ACK]로 전환. Terminator[FIN-WAIT-2]는 FIN(From Receiver)를 받으면 ACK를 전송하고, terminating process 전에 전송되었을지 모르는 패킷을 기다리는 Terminator[TIME-WAIT]로 전환. 일정시간 동안 여분의 패킷을 기다린 후 연결 종료 Terminator[CLOSED].

  7. Step4
  8. Receiver[LAST-ACK]는 ACK(From Terminator)를 받으면, 연결을 종료 Receiver[CLOSED].



reference