malloc 주차가 끝나고, 이제 OS 전 마지막 준비 단계인 <웹서버 만들기> 주차에 들어섰다. 간만에 밀린 운동도 해서 기분은 좋으나 매우 피곤한 관계로, 빠르게 정리하고 집에 갈 예정.
인터넷 네트워크
인터넷 통신
클라이언트와 서버는 어떻게 통신할까? 중간에 인터넷이라는 놈이 둘 사이를 연결해준다. 그러면 이 인터넷은 어떻게 구성되어 있는 걸까? 인터넷은 수많은 서버 노드의 집합이라고 생각하면 된다.
IP(인터넷 프로토콜)
클라이언트와 서버는 무작정 소통하는 게 아니다. 둘 사이에는 일종의 전송 규칙을 설정해 통신하는데, 이때 정하는 규칙을 IP(인터넷 프로토콜)이라고 한다.
IP의 역할은 크게 두 가지이다.
- IP address를 통해 데이터를 전달
- 패킷 형태로 데이터를 전송
IP는 일종의 통신 규약이라고 했다. IP 주소를 통해 상대방 컴퓨터에 데이터를 전송하는데, 상대방 컴퓨터가 인터넷 상에서 어디에 있는지 알아야 하지 않겠나? 그래서 데이터에 일종의 소포 상자를 싼다. 아래 이미지를 보자. 전송 데이터를 둘러싸고 택배에 송장 태그를 붙이는 것처럼 출발지와 목적지 주소를 붙인다. 이걸 인터넷 망에 띄우면 배송이 되는 시스템이라고 보면 된다.
IP 한계
1. 비연결성
IP는 상대방 컴퓨터에서 패킷을 못 받는 상황일 때도 전송한다. 그도 그럴 것이, 우리가 택배를 보낼 때 상대방이 집에 있는지 없는지까지 고려하지는 않기 때문이다. 문제는 택배를 보낼 때는 택배만 보내고 상대방이 받든 말든 상관하지 않는 것과 달리(단방향), 여기서는 상대방 컴퓨터에 무언가를 요청하는 것이기 때문에(양방향) 상대방이 집에 없으면 내가 보낸 편지에 답장을 받을 수 없을 것이다. 게다가 답장을 못 받는 게 컴퓨터가 느려서인지, 아니면 상대방이 컴퓨터를 꺼서인지 확인할 방도가 없다. 상대방이 답장을 보내지 않기 때문. 이것이 비연결성이다.
2. 비신뢰성
IP를 보냈는데 중간에 패킷이 사라지면 어떡할까? 이를 패킷 소실이라고 하는데, 앞서 인터넷은 수많은 서버의 집합이라고 했다. 노드 사이에서 패킷 경로가 꼬여서 만약 패킷이 중간에 길을 잃었다고 해보자. 위의 비연결성에서 연결지어 생각해보면 패킷이 길을 잃었다고 해서 우리가 이를 알 방도가 없다.
혹은 패킷이 보낸 순서대로 도착하지 않으면? 1->2 순서로 보냈는데 2->1 순서로 상대방이 받게 되면 문제가 생긴다. (우리 학교 학생들 키를 큰 순서로 정렬해놓은 자료를 보낸다고 해보자. 정렬이 깨지면 문제가 생길 것이다.)
이 문제를 해결하는 것이 TCP와 UDP이다.
TCP & UDP
위에서 말한 IP 관련 문제를 해결하기 위해 TCP & UDP가 등장한다.
인터넷 프로토콜 스택 4계층
아래와 같이 인터넷 프로토콜 스택은 총 4계층으로 나뉘어져 있는데 (OSI는 아래 물리 계층까지 합해서 7계층) 보면 IP가 더 낮은 레벨에 있고 그 위에 전송 계층으로 TCP와 UDP가 있다.
이 중 프로토콜 계층만 따로 보자. 컴퓨터에서는 어떤 식으로 소통하는지 각 계층에 우리가 잘 아는 현실의 물건과 대입시켜본다. 옆집 홍구한테 Hello world를 전송한다고 해보자.
위 이미지처럼
1. 프로그램에서 hello, world! 메시지를 생성한다.
2. 이를 애플리케이션 계층의 소켓 라이브러리를 통해 아랫단으로 전달한다.
3. TCP 정보를 생성한다. 이때, 메시지 데이터를 포함시킨다.
4. IP 패킷을 생성한다. TCP 데이터를 포함한다.
5. 이를 LAN 카드를 통해 인터넷 망으로 전송한다.
지금은 TCP를 정리하고 있으니 TCP를 보자. TCP 정보는 어떻게 생겨먹었나?
기존 IP 패킷 안에 초록색 박스가 들어간 것을 볼 수 있는데, 여기에는 출발/목적지 PORT, 전송 제어, 순서, 검증 정보 등이 들어있다. 하나하나씩 뜯어보자.
TCP 특징
TCP란, 전송 제어 프로토콜(Transmission Control Protocol)을 말한다. 프로토콜이라는 말이 자꾸 나오는데, 통신 규약이라고 해서 인터넷 상에서 통신할 때 정한 규칙이라고 생각하면 된다. 이 TCP는 아래 두 가지 특징을 가진다.
1. 연결 지향 - TCP 3 way handshake(가상 연결) => IP의 비연결성 해결
2. 데이터 전달 보증, 순서 보장 => IP의 비신뢰성 해결
1. 연결 지향
기존의 IP에서는 상대방 컴퓨터가 on인지 off인지 상관없이 패킷을 보내 데이터를 달라고 징징댔다. 하지만 TCP에서는 1) 상대방 컴퓨터가 서비스 가능한 상태인지 확인(일종의 노크)을 하고 2) 상대방이 응답을 하면 3) 그제서야 데이터를 달라고 요청한다. 이 과정에서 총 세 번 왔다갔다 하는 것을 볼 수 있는데, 이를 3 way handshake라고 한다. 아래 이미지를 보자.
SYN은 우리가 택배가 왔다고 노크를 하는 것이다. 그럼 상대방이 어, 왔니? 하고 대답할 텐데(=ACK, 요청 수락) 그러면 다시 우리쪽 컴퓨터로 쫄래쫄래 와서 진짜 데이터를 달라고 요청한다. 그러고 나면 마지막으로 서버에서 클라이언트한테 데이터를 전송한다. 만약 서버가 꺼져있어서 서비스를 하지 않는 상태라면 어떨까? 2번이 끊겨있어 답장이 오지 않을테니(아마 일정 시간 동안 기다려보는 방식인듯) 연결이 되지 않았다는 것을 알 수 있다. 그러면 우리는 아, 서버가 응답을 하지 않는 상태이구나! 라는 것을 알고 오류 표시를 띄울 것이다. 위 이미지와 달리 요즘은 3번 과정에서 바로 서버에서 클라이언트에게 데이터를 전송해준다고 한다.
참고로, 위의 handshake 과정은 물리적 연결이 아닌 논리적 연결이다. 이게 무슨 말이냐, 저 둘 사이 통신을 돕는 인터넷 상의 수많은 노드들이 물리적으로 저 둘 사이를 연결해주어서 둘만의 통로가 쫜! 하고 만들어지는 게 아니다. 중간의 노드는 저 클라이언트와 저 서버가 서로 연결됐는지 전혀 모른다. 쉽게 말해 둘만을 위한 전용 랜선이 따로 있는 것이 아니다 정도로 이해하자.
이외에도 TCP에서는 데이터 전달 보증과 순서를 보장한다.
데이터 전달 보증은 무엇이냐, 말 그대로 서버한테 데이터를 전송하는데 성공했다면 서버는 굳이 그럴 일 없음에도 클라이언트한테 데이터 잘 받았다고 안부 인사를 전달해주는 것이다. 오고가는 정이랄까.
앞서 순서가 깨지면 혼란스러워진다고 했다. 따라서 서버는 순서가 꼬였다면 꼬인 순서의 시작점부터 다시 보내라고 클라이언트에게 요청한다. 이를 통해 순서를 보장한다.
UDP(User Datagram Protocol)
이때까지 TCP/IP만 주구장창 설명했다. 그럼 UDP는 무엇일까? 여러 가지 기능을 제공했던 TCP와 달리, UDP는 기능이 매우 단순하다(별 게 없다는 뜻). 비유하자면 하얀 도화지와 같다. IP와 거의 같으나 PORT와 체크섬 정도만 추가한 형태라고 보면 된다. 따라서 애플리케이션에서 추가 작업이 필요하다.
또한, TCP에서 제공했던 3 way handshake와 같은 기능은 제공하지 않는다. 이렇게 보면 누가 UDP를 사용할까 싶은데, 최근 들어(HTTP/2, HTTP/3) UDP를 사용하는 추세라고 한다. 다양한 기능을 제공하는 TCP는 그에 반비례해 속도가 느려지는 반면, UDP는 매우 빠른 속도를 자랑하기 때문이다.
Reference
'정글사관학교 개발일지 > 웹 서버' 카테고리의 다른 글
정글사관학교 51일차 TIL: 프록시, mmap()과 malloc() 차이 정리 (2) | 2021.12.23 |
---|---|
정글사관학교 50일차 TIL: 웹서버 개념 정리 (0) | 2021.12.21 |
정글사관학교 49일차 TIL: 파일 디스크립터, 소켓 프로그래밍 (0) | 2021.12.20 |
정글사관학교 48일차 TIL: 웹브라우저 요청 흐름, HTTP (0) | 2021.12.20 |
정글사관학교 47일차 TIL: PORT, URI, 웹브라우저 요청 흐름(중요) (0) | 2021.12.18 |