본문 바로가기

CS 지식

웹 브라우저에 URL을 입력하면 일어나는 일(3)

TCP(Transmission Control Protocol)의 연결과정

지난번 웹 브라우저에 URL을 입력하면 일어나는 일(2) 포스팅에서 URL을 입력했을 때 IP address를 찾는 과정까지 살펴보았습니다.

이번 포스팅에서 뒤를 이어 IP address를 찾았으니 서버와 통신하는 과정을 살펴보겠습니다.

웹 브라우저에 URL을 입력했을 때 일어나는 과정 6단계

더보기
  1. 웹 브라우저에 URL(www.naver.com)을 입력한다.(도메인은 IP address가 mapping 된 것이다.)
  2. 웹 브라우저에 URL을 입력했을 때 mapping 된 Domain이 IP address를 3단계에 걸쳐 확인한다.
  3. IP주소를 찾았다면, 그 주소를 갖고있는 웹 서버에 접근하여 TCP연결을 한다.
  4. TCP통신이 완료되면, 웹 브라우저가 웹 서버로 HTTP request를 보낸다.
  5. 웹 서버가 웹 브라우저에 HTTP response를 보낸다.
  6. 웹 브라우저에서 html 코드를 렌더링하여 화면에 보여준다.

TCP(Transmission Control Protocol) 통신

TCP란?

TCP(전송 제어 프로토콜)는 Client와 Server 이 두 개의 호스트를 연결하고 데이터 스트림을 교환하게 해주는 중요한 네트워크 프로토콜이다. (출처 : https://developer.mozilla.org/ko/docs/Glossary/TCP)

즉, 쉽게 이야기해서 어떤 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜)입니다. TCP는 통신하기 전에 Handshake라는 과정을 거쳐 서로 통신을 할 수 있는 상태를 만들어야 통신할 수 있습니다. 웹 브라우저에서 요청한 HTTP 통신은 TCP 통신이 되고 나서 통신할 수 있습니다.

TCP의 3-Way Handshake(연결)

3-Way Handshake 두 노드(Client-Server) 사이에 연결하는 과정을 의미합니다. 3-Way는 3번의 확인 과정을 거친다고 해서 붙여진 이름입니다.

출처 : https://seongonion.tistory.com/74

  1. Client -> Server (#1)
    클라이언트는 서버로 SYN(Synchronize Sequence Numbers)를 보낸다. SYN는 연결을 확인하기 위한 무작위 숫자값으로 flag역할을 한다.
    Client : 내 말 들려?
  2. Server -> Client(#2)
    클라이언트의 요청을 확인한 서버는 요청을 잘 받았다는 회신을 SYN에 ACK(Acknowledgement)를 더해 다시 클라이언트로 보낸다. ACK는 응답을 확인했다는 것을 의미하는 flag다.
    Server : 응 잘 들려! 내 말은 들려?!
  3. Client -> Server(#3)
    서버로부터 내 요청을 잘 받았다는 회신받은 후 서버의 요청을 잘 받았다는 응답 ACK를 다시 서버에게 보낸다.
    Client : 잘 들려!

이와 같이 3-Way handshake를 완료하면 두 노드는 데이터를 주고받을 수 있는 통신할 수 있는 상태가 된다.

반대로 연결된 상태를 해제하기 위해서는 4-Way handshake방식으로 진행된다.

TCP Header

출처 : https://evan-moon.github.io/2019/11/10/header-of-tcp/

다음으로는 TCP Header 구조에 대해 살펴보겠습니다. 두 노드가 3-Way handshake에 의해 연결되고 난 후 데이터를 전송하게 되는데 이때 데이터 단위를 세그먼트라고 합니다. 이 세그먼트는 TCP Header + Data를 합친 것을 말합니다.

헤더는 여러 개의 필드로 나누어져 있고 최소 20 byte ~ 60 byte의 크기를 가집니다. 각 필드의 비트를 0 또는 1로 변경하여 전송하고자 하는 세그먼트의 정보를 나타냅니다.

  1. Source Port, Destination port(16bit)
    첫 번째 필드는 세그먼트의 출발지와 목적지를 나타내는 필드로, 각각 16비트를 할당받습니다. Source port는 요청을 보내는 쪽에서 통신을 사용하기 위한 port 번호고, Destination port는 요청을 수신하는 쪽의 port 번호입니다. OSI 7 Layer에서 4계층인 TCP는 3계층의 IP(Internet protocol)와 같이 사용되는데 이때 IP 헤더의 첫 번째 필드에 송신자와 수신자의 IP정보가 들어있어 TCP 헤더의 port 번호와 IP 헤더의 address정보를 가지고 통신 대상의 위치를 알 수 있는 것입니다.
  2. Sequence number(32bit)
    연결과정에서 봤었던 송신자가 수신자에게 보내는 랜덤한 수이며, 수신자가 데이터를 받았을 때 이 번호를 통해 세그먼트의 순서를 파악하여 올바른 순서로 데이터를 재조립할 수 있게 됩니다.
  3. Acknowledgment number(32bit)
    송신자가 보낸 데이터에 수신자가 ACK 번호를 붙여 데이터를 잘 받았다는 표시를 한 후 다시 송신자에게 보냅니다.
  4. Data Offset(4bit)
    데이터 옵셋 필드에는 전체 세그먼트 중에서 헤더가 아닌 데이터가 시작되는 위치가 어디부터인지를 표시합니다.
    왜냐하면 헤더가 끝나고 나서 데이터가 표시되기 때문입니다.
  5. Reserved(3bit)
    나중에 사용할 수도 있기 때문에 예약된 필드입니다.
  6. Flags(각각 1bit)
    세그먼트의 용도와 내용을 결정하는 Flag입니다.
    기존에는 6개의 플래그만 사용했지만, 혼잡 제어 기능 향상을 위해 Reserved 필드를 사용하여 NS, CWR, ECE 플래그가 추가되었습니다.
  7. Window Size(16bit)
    Window Size 필드에는 한 번에 전송할 수 있는 데이터의 양을 의미하는 값을 담을 수 있습니다.
    수신자가 너무 많은 데이터를 받아서 감당하기 어려운 경우에는 Window Size를 줄이고 송신자는 이 사이즈에 해당하는 만큼만 데이터를 보낼 수 있습니다.
  8. Checksum
    오류 검출을 위해 사용되는 필드
  9. Urgent Pointer
    긴급 데이터가 시작되는 위치
  10. Options
    앞서 TCP Header의 크기가 최소 20 ~ 60byte의 크기를 가진다고 하였는데 이 Options 필드에 의해 40type를 할당할 수 있다.

지금까지 TCP 연결 과정과 TCP 통신에 대해 알아보았습니다. 다음에는 TCP 연결이 되었으니 HTTP request 보내는 과정을 알아보겠습니다.


출처

  • https://velog.io/@inourbubble2/TCP-Header%EB%A5%BC-%EC%95%8C%EB%A9%B4-TCP%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8B%A4
  • https://www.joinc.co.kr/w/Site/TCP_IP/TCP_Header
  • https://evan-moon.github.io/2019/11/10/header-of-tcp/