이 그림은 인터넷 통신이 어떤 식으로 구성되는지 나타낸 것이다.

인터넷 통신은 end system 간 패킷을 주고받는 방식으로 이루어진다.
클라이언트(end system)는 요청을 보낼 때 패킷에 최종 목적지의 IP 주소를 담아 네트워크로 전송한다.
패킷을 받은 라우터는 패킷 안에 있는 목적지 IP 주소를 확인한 후,
라우팅 테이블을 참조하여 다음 홉(next hop)으로 패킷을 전달한다.
패킷이 최종 목적지 호스트(end system)에 도달하면
Network Layer에서 Transport Layer로 전달되고,
최종적으로 애플리케이션이 데이터를 처리한다.

같은 IP 내에서 여러 프로세스를 구분하기 위해
Transport Layer는 포트 번호(port number)를 사용한다.
같은 IP 주소를 사용하더라도
과 같이 포트 번호에 따라 서로 다른 애플리케이션 동작을 수행한다.
인터넷 통신 과정에서는 여러 문제가 발생할 수 있다.
이러한 문제들은 TCP를 통해 해결할 수 있다.
최종 목적지의 컴퓨터가 꺼져 있다면 패킷을 받을 수 없다.
따라서 패킷을 보내기 전에 클라이언트는
목적지 IP의 특정 포트에서 TCP 프로세스가
연결을 수락할 수 있는 상태인지 확인한다.
이때 사용되는 과정이 3-way handshake이다.

클라이언트는 서버에 SYN 패킷을 전송하고,
서버의 응답에 대해 ACK 패킷을 전송하면
3-way handshake가 완료된다.
이를 통해 서로 통신을 시작할 준비가 되었음이 확인된다.
TCP는 ACK를 통해 수신 여부를 확인한다.
일정 시간 동안 ACK가 도착하지 않으면
해당 패킷이 소실되었다고 판단하고 재전송을 수행하여
데이터 전달을 보장한다.
패킷의 크기가 큰 경우 데이터는 여러 개로 쪼개져 전송되며,
이 과정에서 뒤에 보낸 패킷이 먼저 도착할 수 있다.
TCP는 이 문제를 sequence number로 해결한다.
각 패킷에 순서 번호를 부여하여 전송하고,
수신 측은 이를 기반으로 데이터를 재정렬한다.
만약 중간에 누락된 패킷이 있다면
해당 패킷에 대해 재전송을 요청하여 문제를 해결한다.
UDP는 신뢰성보다 속도를 우선하는 프로토콜이다.
UDP는 TCP와 달리
을 제공하지 않는다.
기존 IP 위에 포트 번호와 체크섬 등
최소한의 헤더만 추가한 프로토콜로,
TCP에 비해 신뢰성은 낮지만 빠르다는 장점이 있다.
정리하면,
IP는 전달을 담당하고
TCP는 신뢰성을 보장하며
UDP는 속도를 우선한다.
Web Server는 html, css, 이미지와 같은 정적 리소스를 처리해주는 서버를 말한다. 대표적으로는 Apache, Nginx 등이 있다.
WAS는 DB 조회, 로직 처리와 같은 동적 리소스를 처리해주는 서버를 말한다. 대표적으로는 Spring Boot의 내장 서버인 Tomcat이 있다.
WAS는 동적 리소소뿐만 아니라 정적 리소스까지 처리할 수 있다. 그러나 현재 Web Server를 많이 쓰고있다.
왜그럴까?
이는 비용, 보안 측면에서 여러 이유가 있다. 이건 추후에 다뤄보도록 하겠다.

