어떤 상태의 Http를 사용할까? API url설계는 어떻게 할까?
등등 백엔드 개발자는 HTTP에 관한 고민을 많이 한다.
실무에 꼭 필요한 HTTP 기본지식을 정리해볼까 한다.
프로토콜 계층
✅IP(Internet Protocol)
특징
- 지정한 IP 주소에 데이터 전달
- 패킷(Packet) 이라는 통신 단위로 데이터 전달
- 출발지ip, 목적지ip 로 패킷 전달
- 수많은 노드들을 걸쳐서 목적지ip 로 도착
IP 프로토콜의 한계
- 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송
- 비신뢰성
- 중간에 패킷이 사라져도 알 방법이 없음
- 패킷의 순서가 보장되지 않음
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이라면 올바르게 전달해주지 못함
- 패킷 소실
- 중간에 서버에서 문제가 있따면 패킷이 유실되며 소실되도 클라이언트는 알지 못함
- 패킷 전달 순서 문제 발생
- 바이트 크기에 쪼개진 패킷들이 서로 다른 노드를 탈 수 있다.
- 무수히 타다보면 순서가 바뀌어서 도착할 수 있음
IP의 정보로 바로 데이터를 보내기에는 이러한 많은 문제점이 존재한다. 그래서 우리는 TCP를 사용한다.
✅TCP(Transmission Control Protocol)
: 전송 제어 프로토콜
특징
- TCP/IP 패킷 정보: 출발지PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보
- IP만으로 해결되지 않았던 추가 정보 존재
- 연결 지향 - TCP 3 way handshaking(가상 연결)
- 데이터 전달 보증
- 순서 보장
- 신뢰할 수 있는 프로토콜
TCP 3Way handshake
TCP 3 Way handshake
1. tcp 프로토콜로 연결을 하면 syn이라는 메세지 전달
2. syn + ack 반환
3. ack 전달데이터 전송
-> 양쪽에서 syn, ack를 보낸다. 총 3번을 주고받는다
-> 이러한 과정을 걸치고 연결을 확인 후에 데이터를 주고받는다.
-> 요즘은 최적화 되어서 3번 ack를 보낼 때 같이 데이터를 전송하는 경우도 있다.
진짜 연결이 아닌 논리적 연결(개념적 연결)이다. 중간에 수많은 서버를 걸치기 때문에 중간에 노드는 모른다.
서로 syn, ack를 주고받기 때문에 연결이 되었구나 하고 생각을 하는 것이다.
장점
- 데이터 전달 보증
- tcp는 데이터를 잘 받았따고 서버에서 보내준다. 이는 데이터가 잘 갔는지 보증이 된다.
- 순서 보장
- 큰 메세지를 잘라서 패킷 1,2,3 으로 보냈다. 서버에서 순서가 틀리면 다시 보내라고 요청이 온다.
-> 최적화 되는 경우도 있음 ex)알아서 기다렸다가 패킷을 조합하는 경우 등등
- 큰 메세지를 잘라서 패킷 1,2,3 으로 보냈다. 서버에서 순서가 틀리면 다시 보내라고 요청이 온다.
이 모든것은 IP 보다 순서, 검증 등등 정보가 더 많기 때문이다.
단점
- 신뢰성을 보장하지만 높은 오버헤드를 가져올 수 있음.
- 데이터의 헤더 사이즈가 큼
✅UDP(User Datagram Protocol)
: 사용자 데이터그램 프로토콜특징
- 비 연결성 서비스
- 이전 IP와 비슷한데 하나만 다른것은 Port, 체크섬의 정보가 추가로 존재하다는 것이다.
- TCP는 시간과 데이터의 양도 굉장히 많아서 이미 손을 대지 못하는 프로토콜이다.
- 그 점을 활용해 더 최적화가 가능한 UDP를 커스탐한다.
- 요즘 각광을 받고있다
✅PORT
- 같은 IP내에서 프로세스 구분
- 여러 패킷에서 해당 애플리케이션을 구분해주는 것
✅DNS(Domain Name System)
- IP는 기억하기 어렵다.
- IP는 변경될 수 있다.
도메인 명을 IP주소로 변환
- DNS 서버에 IP를 등록할 수 있다.
- 도메인으로 접근할 수 있음
REFERENCE
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard