지난번 웹 브라우저에 URL을 입력하면 일어나는 일(2) 포스팅에서 URL을 입력했을 때 IP address를 찾는 과정까지 살펴보았습니다.
이번 포스팅에서 뒤를 이어 IP address를 찾았으니 서버와 통신하는 과정을 살펴보겠습니다.
웹 브라우저에 URL을 입력했을 때 일어나는 과정 6단계
- 웹 브라우저에 URL(www.naver.com)을 입력한다.(도메인은 IP address가 mapping 된 것이다.)
- 웹 브라우저에 URL을 입력했을 때 mapping 된 Domain이 IP address를 3단계에 걸쳐 확인한다.
- IP주소를 찾았다면, 그 주소를 갖고있는 웹 서버에 접근하여 TCP연결을 한다.
- TCP통신이 완료되면, 웹 브라우저가 웹 서버로 HTTP request를 보낸다.
- 웹 서버가 웹 브라우저에 HTTP response를 보낸다.
- 웹 브라우저에서 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번의 확인 과정을 거친다고 해서 붙여진 이름입니다.
- Client -> Server (#1)
클라이언트는 서버로 SYN(Synchronize Sequence Numbers)를 보낸다. SYN는 연결을 확인하기 위한 무작위 숫자값으로 flag역할을 한다.
Client : 내 말 들려? - Server -> Client(#2)
클라이언트의 요청을 확인한 서버는 요청을 잘 받았다는 회신을 SYN에 ACK(Acknowledgement)를 더해 다시 클라이언트로 보낸다. ACK는 응답을 확인했다는 것을 의미하는 flag다.
Server : 응 잘 들려! 내 말은 들려?! - Client -> Server(#3)
서버로부터 내 요청을 잘 받았다는 회신받은 후 서버의 요청을 잘 받았다는 응답 ACK를 다시 서버에게 보낸다.
Client : 잘 들려!
이와 같이 3-Way handshake를 완료하면 두 노드는 데이터를 주고받을 수 있는 통신할 수 있는 상태가 된다.
반대로 연결된 상태를 해제하기 위해서는 4-Way handshake방식으로 진행된다.
TCP Header
다음으로는 TCP Header 구조에 대해 살펴보겠습니다. 두 노드가 3-Way handshake에 의해 연결되고 난 후 데이터를 전송하게 되는데 이때 데이터 단위를 세그먼트라고 합니다. 이 세그먼트는 TCP Header + Data를 합친 것을 말합니다.
헤더는 여러 개의 필드로 나누어져 있고 최소 20 byte ~ 60 byte의 크기를 가집니다. 각 필드의 비트를 0 또는 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정보를 가지고 통신 대상의 위치를 알 수 있는 것입니다. - Sequence number(32bit)
연결과정에서 봤었던 송신자가 수신자에게 보내는 랜덤한 수이며, 수신자가 데이터를 받았을 때 이 번호를 통해 세그먼트의 순서를 파악하여 올바른 순서로 데이터를 재조립할 수 있게 됩니다. - Acknowledgment number(32bit)
송신자가 보낸 데이터에 수신자가 ACK 번호를 붙여 데이터를 잘 받았다는 표시를 한 후 다시 송신자에게 보냅니다. - Data Offset(4bit)
데이터 옵셋 필드에는 전체 세그먼트 중에서 헤더가 아닌 데이터가 시작되는 위치가 어디부터인지를 표시합니다.
왜냐하면 헤더가 끝나고 나서 데이터가 표시되기 때문입니다. - Reserved(3bit)
나중에 사용할 수도 있기 때문에 예약된 필드입니다. - Flags(각각 1bit)
세그먼트의 용도와 내용을 결정하는 Flag입니다.
기존에는 6개의 플래그만 사용했지만, 혼잡 제어 기능 향상을 위해 Reserved 필드를 사용하여 NS, CWR, ECE 플래그가 추가되었습니다. - Window Size(16bit)
Window Size 필드에는 한 번에 전송할 수 있는 데이터의 양을 의미하는 값을 담을 수 있습니다.
수신자가 너무 많은 데이터를 받아서 감당하기 어려운 경우에는 Window Size를 줄이고 송신자는 이 사이즈에 해당하는 만큼만 데이터를 보낼 수 있습니다. - Checksum
오류 검출을 위해 사용되는 필드 - Urgent Pointer
긴급 데이터가 시작되는 위치 - 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/
'CS 지식' 카테고리의 다른 글
웹 브라우저에 URL을 입력하면 일어나는 일(2) (0) | 2023.01.24 |
---|---|
웹 브라우저에 URL을 입력하면 일어나는 일(1) (2) | 2023.01.15 |