김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 듣고 정리한 내용입니다.
클라이언트와 서버가 통신하려면 컴퓨터 2대가 바로 옆에 케이블로 연결되어 있는 게 아닌 한 인터넷망을 거쳐야 한다. 근데 그 중간에 해저 케이블이 있을지 우주로 보낼지 모른다. 안전하게 보내야 한다. 그래서 필요한 게 인터넷 프로토콜(IP)이다.
미국 사는 친구에게 소포 보내듯이 패킷이라는 단위에 발송자, 수신자 IP, 메시지('hello world')를 적어서 보내면 인터넷망에 있는 노드가 서로 서로 '200.200.1 IP 주소로 가는 곳 어디야?' 하면서 친구 집으로 보내 준다.
친구가 잘 받았으면 잘 받았다고 또 발송자, 수신자 IP, 메시지('OK')를 패킷에 담아 보낸다.
IP 프로토콜의 단점
비연결성
받는 사람이 있는지 없는지 모르고 그냥 보낸다.
친구 컴퓨터 꺼져 있을 수도 있다.
받는 사람이 아직 거기 사는지 모른 채로 소포 보내는 것과 같다.
비신뢰성
패킷을 중간에 잃어버리면? (패킷 유실돼도 알 수 없다)
패킷 여러 개 던졌을 때 순서대로 안 가면?
이 문제를 해결하는 게 바로 TCP/UDP!
지금 이 안에는 TCP 데이터가 포함되어 있다!(아까 초록색으로 먼저 씌웠으니까)
그리고 이걸 LAN 카드를 거쳐서 서버로 전송한다.
TCP 데이터 안에는 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등이 들어 있다.(초록색 테두리 영역)
UDP는 IP랑 거의 똑같은데 PORT가 있다는 차이가 있다.
PORT란? 하나의 IP에서 여러 개의 애플리케이션 실행할 때는 패킷도 여러 개니 패킷 구분하기 위해
한 컴퓨터로 여러 곳에 요청 보내고 있으면(친구랑 게임이랑 화상통화 동시에 하면서 다른 곳으로 브라우저 요청도 하면) 패킷을 보낼 때도, 받을 때도 어디로 가는 패킷인지, 어디서 온 패킷인지 알 수 없다. 이걸 구분해 주는 게 PORT다.
출발지 / 목적지 IP가 있는 것처럼 출발지 / 목적지 PORT도 있다.
IP는 아파트고 PORT는 동호수다!
브라우저가 요청 응답할 때 내 요청 포트를 어떻게 알지? 내가 패킷 보낼 때 TCP 데이터 안에 출발지 PORT 넣어서 보내니까.
응답할 때도 마찬가지로 출발지 PORT 넣어서 보낸다.(아마?!)
DNS는 전화번호부와 같다.
IP는 기억하기 어렵고 변경될 수도 있는데 DNS가 이 단점을 보완한다.
DNS 서버에 IP를 등록해 놓으면,
구글 IP 주소에 접근하고 싶을 때 www.google.com만 입력하면 그 도메인 네임에 맞는 IP 주소에 접근할 수 있다.