Network #GET #POST #3-wayHandshake

곽서현·2022년 11월 9일
0

HTTP의 GET, POST

둘 다 HTTP 프로토콜을 이용해서 서버에 무엇인가를 요청할 때 사용하는 방식이다.

📍 GET

  • 요청하는 데이터가 Http Request Message의 Header 부분에 url이 담겨서 전송됨
  • url 상에 ? 뒤에 데이터가 붙어 request를 보냄 => 전송할 수 있는 데이터의 크기가 제한적
    • 보안이 필요한 데이터(비밀번호)에 대해서는 데이터가 그대로 url에 노출되므로 적절하지 않음
www.example.com?id=mommoo&pass=1234 
// ?와 &가 구분자 역할을 해줌
// URI?key1=value1&key2=value2
  • Body가 빈 상태로 전송되므로 헤더의 내용 중 body 데이터를 설명하는 Content-Type이라는 헤더필드는 들어가지 않는다.

📍 Post

  • Http Request Message의 Body에 데이터가 담겨서 request가 전송됨
  • Content-Type이라는 헤더필드가 들어가고 어떤 데이터 타입인지 명시한다.

    💡 application/x-www-form-urlencoded // Default
    💡 text/plain // text
    💡 multipart/form-data // 파일 전송

  • 데이터 크기가 Get 방식보다 크고, Get에 비해 상대적으로 보안이 나은 편이다.
    • POST든 GET이든 보내는 데이터는 전부 클라이언트측에서 볼 수 있다. 단지 GET방식은 URL에 데이터가 표시되여 별다른 노력없이 볼 수 있어서지, 두 방식 전부 보안을 생각한다면 암호화 해야한다.

🙄 둘이 뭐가 다른뎁쇼
A. Get은 Select적 성향을 갖고 있어서 서버에서 어떤 데이터를 가져와서 보여주는 용도이다. 반면, Post는 서버의 값이나 상태를 변경(추가)하기 위해서 사용된다.
또한, Get 방식의 요청은 브라우저에서 캐싱할 수 있다. 따라서 Get 방식으로 요청한다면 기존에 캐싱되었던 데이터가 응답될 가능성이 존재한다.
추가로, 캐싱이 기본인 Get은 Post보다 속도가 빠르다는 특징도 있다.

TCP 3-way Handshake

3-Way Handshake 는 TCP의 접속,4-Way Handshake는 TCP의 접속 해제 과정이다.

  • 포트(PORT) 상태 정보

    • LISTEN : 서버의 데몬이 떠서 접속 요청을 기다리는 상태
    • SYN-SENT : 로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태
    • SYN_RECEIVED : 서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답을 하였지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태
    • ESTABLISHED : 3 way-handshaking 이 완료된 후 서로 연결된 상태
    • FIN-WAIT1, CLOSE-WAIT, FIN-WAIT2 : 서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태
    • TIME-WAIT : 연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어두고 있는 상태
    • CLOSING : 흔하지 않지만 주로 확인 메시지가 전송도중 분실된 상태
    • CLOSED : 완전히 종료
  • 플래그 정보

    • TCP Header에는 CONTROL BIT(6비트)가 존재하며, 각각의 bit는 "URG-ACK-PSH-RST-SYN-FIN"의 의미를 가진다.

      • 즉, 해당 위치의 bit가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타낸다.
  • SYN(Synchronize Sequence Number) / 000010
    💡 연결 설정. Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송한다.

  • ACK(Acknowledgement) / 010000
    💡 응답 확인. 패킷을 받았다는 것을 의미한다. ACK Number 필드가 유효한지 나타내며 양단 프로세스가 쉬지 않고 데이터를 전송한다고 가정하면 최초 연결 설정 과정에서 전송되는 첫번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1로 지정된다.
    ** 보낸 시퀀스 번호에 TCP 계층에서의 길이 또는 양을 더한 것과 같은 값을 ACK에 포함하여 전송

  • FIN(Finish) / 000001
    💡 연결 해제. 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.

개념

TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정(Connection Establish) 하는 과정
양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한 쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.

3-way handshake의 기본 매커니즘

TCP 통신은 PAR을 통해 신뢰적인 통신을 제공한다.

💡 PAR을 사용하는 기기는 ack을 받을 때까지 데이터 유닛을 재전송한다!

  • 수신자가 데이터 유닛(세그먼트)이 손상된 것을 확인하면(Error Detection에 사용되는 transport layer의 checksum을 활용), 해당 세그먼트를 없앤다. 그러면 sender는 positive ack이 오지 않은 데이터 유닛을 다시 보내야한다.

⇒ 이 과정에서 클라이언트와 서버 사이에서 3개의 Segment가 교환되는 것을 확인할 수 있다. 이것이 바로 3-way handshake의 기본 매커니즘이다.

작동방식

  • Client는 서버와 연결하기 위해 3-way handshake를 통해 연결 요청을 한다.
    • Client, Server는 연결 요청을 누가 했느냐에 따라 정해진다. 요청을 먼저 보낸 쪽이 Client, 요청 받는 수신 측이 Server

📍 Step 1(SYN)
클라이언트는 서버와 커넥션을 연결하기 위해 SYN을 보낸다. (seq : x)

송신자가 최초로 데이터를 전송할 때 swquence number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.

  • PORT 상태
    Client : CLOSED- SYN_SENT 로 변함
    Server : LISTEN

📍 Step 2(SYN+ACK)
서버가 SYN을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (seq : y, ACK : x + 1)

  1. 접속 요청을 받은 Server가 요청을 수락했으며 접속 요청 프로세스인 클라이언트도 포트를 열어달라는 메세지를 선종(SYN-ACK signal bits set)
  2. ACK number 필드를 시퀀스넘버+1 로 지정하고 SYN과 ACK 플래그 비트를 1로 설정한 세그먼트 전송 (Seq=y, Ack=x+1, SYN, ACK)
  • PORT 상태
    Client : CLOSED
    Server : SYN_RCV

📍 Step 3(ACK
클라이언트는 서버의 응답으로 ACK(x+1)와 SYN(y) 패킷을 받고, ACK(y+1)를 서버로 보냄

마지막으로 접속 요청 프로세스(클라이언트측)가 수락 확인을 보내 연결을 맺음
이때, 전송할 데이터가 있으면 이 단계에서 데이터 전송 가능하다.

  • PORT 상태
    Client : ESTABLISED
    Server : SYN_RCV ⇒ ACK ⇒ ESTABLISED

Full-duplex 통신의 구성

Step 1, 2에서는 P→Q 방향에 대한 연결 파라미터(시퀀스 번호)를 설정하고 이를 승인한다.
Step 2, 3에서는 Q→P 방향에 대한 연결 파라미터(시퀀스 번호)를 설정하고 이를 승인한다.
⇒ 이를 통해 full-duplex 통신이 구축됨!

[참고]
https://velog.io/@averycode/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP%EC%99%80-3-Way-Handshake4-Way-Handshake

0개의 댓글