NHN Forward에 갔다가 인프런 부스에서 받은 쿠폰으로 http 강의를 듣기 시작했다. 학부 때 배우긴 했지만 잊어버린 내용도 있어서 강의를 들으며 다시 정리해보려 한다 :-)
김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 듣고 정리한 내용입니다.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
인터넷 네트워크
IP(Internet Protocol)
인터넷을 통해 데이터를 송수신할 때 필요한 규칙을 말한다.
역할
- 지정한 ip 주소에 데이터 전달
- 패킷이라는 통신 단위로 데이터 전달
IP 패킷에는 데이터와 출발지 IP, 목적지 IP 등을 담아 전달한다. (클라이언트에서 보낼 때와 서버에서 보낼 때 서로 다른 인터넷 망을 통할 수도 있다.)
한계
- 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송(대상 서버가 패킷을 받을 수 있는 상태인지 모름)
- 비신뢰성
- 중간에 문제가 생기면 패킷이 소실될 수 있음
- 패킷이 순서대로 오지 않을 수 있음
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 경우 구분할 수 없음
패킷 전달 순서 문제
패킷 용량이 클 때는 한 번에 보내기 힘들기 때문에 끊어서 보낸다. (대략 1500byte 단위)
여러 패킷을 보냈을 때 다 같은 서버 노드를 통해 이동하는 것이 아니기 때문에 나중에 보낸 패킷이 먼저 도착할 수도 있다. ip 프로토콜 만드로는 이런 문제를 해결할 수 없기 때문에 이런 경우 TCP를 사용한다.
TCP
TCP(Transmission Control Protocol): 전송 제어 프로토콜
TCP/IP 패킷 정보
TCP/IP 패킷에는 출발지 포트, 목적지 포트, 전송 제어, 순서, 검증 정보 등이 담긴다.
-> ip 만으로는 해결이 안됐던 순서 제어 등이 해결된다.
특징
- 신뢰할 수 있는 프로토콜
- 연결 지향: TCP 3 way handshake(가상 연결)
- 데이터 전달 보증 -> 메세지가 가다가 중간에 누락되면 알 수 있다.
- 순서 보장
TCP 3 way handshake
- 클라이언트 -> 서버: SYN
- 서버 -> 클라이언트: SYN + ACK
- 클라이언트 -> 서버: ACK
- 데이터 전송
SYN은 접속 요청, ACK은 요청 수락을 의미한다.
3번 단계에서 데이터도 함께 전송 가능하다.
3way handshake를 통해 클라이언트도 서버를 믿을 수 있고, 서버도 클라이언트를 믿을 수 있게 된다.
데이터 전달 보증
데이터를 전송하면 데이터를 잘 받았다고 보내준다. 이를 통해 데이터가 잘 전송되었는지 확인할 수 있다.
순서 보장
예를 들어 패킷 1, 2, 3 순서로 전송했는데 1, 3, 2 순서로 도착했다면 1 뒤로 버리고 서버에서 클라이언트도 패킷 2부터 다시 보내라고 한다.
이는 TCP 패킷 정보에 순서 정보도 포함되어 있기 때문에 가능하다.
UDP
UDP(User Datagram Protocol): 사용자 데이터그램 프로토콜
특징
- 연결 지향 - TCP 3 way handshake X
- 데이터 전달 보증 X
- 순서 보장 X
- 데이터 전달 및 순서가 보장되지 않지만 단순하고 빠름
- IP와 거의 같다. (+ port + 체크섬 정도만 추가)
- 애플리케이션에서 추가적인 작업 필요
포트는 하나의 IP에서 여러 애플리케이션이 실행 중일 때 내 IP로 오는 패킷이 어떤 애플리케이션 용인지 구분할 때 쓴다.
체크섬은 이 메세지에 대해 제대로 맞는지 검증해주는 데이터이다.
TCP의 경우 3 way handshake하려면 시간도 걸리고 이미 많은 옵션이 설정되어 있기 때문에 더 최적화하고 싶어도 하기 힘들다.
udp는 애플리케이션에서 최적화를 해줄 수 있기 때문에 최근에 각광받는 중이다.
PORT
TCP, UDP 패킷에는 출발지 포트와 목적지 포트가 존재한다.
IP는 목적지 서버를 찾는 것을 의미하고, 포트는 서버 안에서 도는 애플리케이션들을 구분하는 것이다. (IP가 아파트라면 포트는 몇동 몇호같은 느낌!)
- 0 ~ 65535 까지 할당 가능
- 0 ~ 1023: 잘 알려진 포트, 사용하지 않는 것이 좋다.
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
DNS(Domain Name System)
IP는 기억하기 어렵고, 변경될 수 있다. -> DNS 필요!
- 전화번호부
- 도메인 명을 IP 주소로 변환
도메인 명을 입력하면 DNS 서버로 요청을 보내게 되고, 서버에서 그 응답으로 ip 주소를 보내주면 클라이언트는 그 ip 주소로 접속하게 된다.
URI와 웹 브라우저의 요청 흐름
URI(Uniform Resource Identifier)
scheme://[userinfo@]host[:port][/path][?query][#fragment]
https://www.google.com:443/search?q=hello&hl=ko
- scheme: 주로 프로토콜 사용
- userinfo: url에 사용자정보를 포함해서 인증. 거의 사용하지 않음
- host: 호스트명. 도메인명 또는 IP 주소를 직접 사용 가능
- port: 접속 포트. 일반적으로 생략(생략 시 http는 80, https 443)
- path: 리소스 경로. 계층적 구조
- query: key=value 형태. ?로 시작, &로 추가 가능. query parameter, query string 등으로 불림.
- fragment: html 내부 북마크 등에 사용. 서버에 전송하는 정보 아님.
웹 브라우저 요청 흐름
1. DNS 조회
2. IP와 포트 정보를 찾고 http 요청 메세지 생성
3. 소켓 라이브러리를 통해 전달
4. TCP/IP 연결해서 연결 후 데이터 전달
5. TCP/IP 패킷 생성(http 메세지를 포함)
6. 서버에서 http 응답 메세지 생성
7. 클라이언트에서 응답 메세지를 받아 렌더링
'TIL' 카테고리의 다른 글
[TIL] 22.12.04 HTTP vs HTTPS (0) | 2022.12.04 |
---|---|
[TIL] 22.11.30 HTTP 기본 (0) | 2022.12.01 |
[TIL] 22.11.22 SEO 기본 가이드(4) (0) | 2022.11.23 |
[TIL] 22.11.18 SEO 기본 가이드(3) (0) | 2022.11.18 |
[TIL] 22.11.16 SEO 기본 가이드(2) (0) | 2022.11.16 |