네트워크란, 먼 곳까지 데이터를 전송하게 해줄 수 있는 인프라이다. 이러한 네트워크는 여러 layer로 구성되어 있으며, 상호계층 간에 상호작용으로 긴밀하게 작동하고 있다.
Physical Layer, Data Layer, IP Layer, Transport Layer, Application Layer로 구분할 수 있다. (책에 따라 명칭이나 구성이 다를 수 있습니다.)

출처: https://velog.io/@jeongbeom4693/TCPIP-5%EA%B3%84%EC%B8%B5
이렇게 계층을 구분한 이유는 유지보수 및 개선 용이성 때문이다. 만약 네트워크가 하나의 layer으로만 구분되어있었다면 구글에서는 QUIC을 만들거나 IPv6과 같은 주소가 사용되지 못했을 것이다.
네트워크를 이해하기 위해서는 top-down 방식이 유용하다. 예를 들어, Application layer을 이해할 때는 아래 계층(Transport Layer, IP Layer, ...)가 마법과 같다고 생각해야 한다.
Application Layer에서는 socket(magic door) 개념을 사용한다. 이 socket는 지구 반대편에 있는 또 다른 socket과 연결되어있다. 내가 보낸 메세지는 그대로(in-order, no-loss) 반대편 socket에서 출력된다고 생각하면 된다.
(여기서의 socket number가 port number이다!!)
이런 이유로 Application 개발자들은 머리아픈 네트워크 지식을 가질 필요가 없게된다.
위에서 언급한 socket이 전부는 아니다. 실제로 우리가 많이 사용하는 HTTP, HTTP/2와 같은 프로토콜은 Application Layer protocol이다.
HTTP Protocol에 관해 간단히 살펴보자. HyperText Transfer Protocol의 약자로, HTML, CSS, JS과 같은 파일들을 전송하는 프로토콜이다.
Transport Layer에는 2가지 프로토콜이 있다: TCP, UDP
TCP는 데이터 전송에 있어서 순서와 무결성을 보장하는 프로토콜이고, UDP는 순서와 무결성을 보장하지 않는 프로토콜이다.
UDP는 handshake가 필요없고, Transport Layer에서의 처리 과정이 간단하기 때문에 패킷이 빠르게 다른 client의 application layer으로 전달된다는 장점이 있다.
TCP는 밑에 있는 IP Layer을 사용하여 데이터의 순서와 무결성을 보장해야 한다.
IP Layer은 정말 단순하다. 아무것도 보장하지 않고, 단순히 다른 client으로 데이터를 전송한다. 데이터 덩어리들을 패킷이라 하는데, 패킷의 순서가 전송과정에서 뒤섞일 수 있고 패킷 드랍이 발생해 패킷이 도착하지 않을 수 있다. 더 나아가 패킷이 악의적인 유저에 의해 변조당할 수 있다. 하지만 그런 것을 IP Layer에서 막거나 후처리를 하지 않는다. 묵묵히 Transport Layer으로 패킷을 넘길 뿐이다.
따라서 Transport Layer는 IP 레이어에서 전송/도착하는 패킷을 처리하여 순서와 무결성을 보장해줄 의무가 있다는 것이다.
TCP는 어떻게 패킷의 순서와 무결성을 보장할까?
우선 패킷 무결성의 경우, checksum을 활용하면 데이터가 변조되었는지 확인할 수 있다. 더 나아가 좋은 checksum을 사용하면, 일부 변조된 패킷들을 복구할 수 있다.
데이터의 무결성과 순서는 Sequence Number과 ACK을 통해 보장할 수 있다.
모든 패킷에 순차적인 번호를 붙이는데, 이러한 번호를 Sequence Number라고 한다. 그리고 내가 435번 Sequence Number packet을 받았다면, 반드시 상대방에게 이를 알려야 한다. 이를 위해 ACK 435와 같이 내가 435번 패킷을 받았다는 것을 알리는 패킷을 전송해야 한다.
이를 통해 내가 어디까지 받았고, 어느 패킷을 받지 못했는지를 알려줄 수 있는 것이다.
하지만 이러기 위해서는 서로가 어떤 Sequence Number을 사용할 것인지 정해놓아야 악의적인 유저가 중간에 false ACK이나 false Packet을 보내는 것을 방지할 수 있다.
서로가 TCP 연결을 만들 것을 약속하고, 각자의 SEQ NUM을 주고받는 과정이 TCP Handshake이다.

출처: https://www.geeksforgeeks.org/tcp-3-way-handshake-process/
client에서 보낸 데이터 패킷은 여러개의 router을 타고 가서 server에 도착한다. 이때 패킷이 목적지까지 라우팅되는 과정을 담당하는 것이 IP Layer의 역할이다.
도착지와 목적지를 알아야 하기 때문에 IP Layer에서는 IP Address을 활용합니다. IP Address는 디바이스간 연결(PC-Router, Router-Router)의 endpoint마다 존재합니다. 아래 그림이 그것을 가장 잘 나타내고 있습니다.