전 세계 모든 HTTP 통신은 지구상의 컴퓨터와 네트워크 장비에서 널리 쓰이고 있는 패킷 교환 네트워크 프로토콜들이 계층화된 집합인 TCP/IP를 통해 이루어진다.
아래 URL을 입력받은 브라우저는 다음과 같은 단계를 수행한다.
https://velog.io/@tjdqls1668/http-study-2
velog.io
라는 호스트 명을 추출한다.3.39.215.212
의 80포트로 TCP 커넥션을 생성한다.HTTP가 메세지를 전송할 경우,
TCP 커넥션을 통해 메세지 데이터의 내용을 순서대로 보낸다.
이 모든 것은 TCP/IP에 의해 처리되며, 그 과정은 HTTP 프로그래머에게 보이지 않는다.
-> 각 계층의 interface 표준화 및 다른 계층에 영향을 주지 않는다.
TCP segment와 IP packet의 구조는 다음과 같다.
TCP 커넥션은 4가지 값으로 식별한다.
- 발신지 IP 주소
- 발신지 포트
- 수신지 IP 주소
- 수신지 포트
4가지 커넥션 구성요소를 똑같이 가리키고 있는 커넥션은 있을 수 없다.
-> 유일한 커넥션을 생성한다.
소켓 API 호출 | description |
---|---|
s = socket(<params>) | 소켓 생성 |
bind(s, <local IP: port> | 소켓에 로컬 포트 번호, 인터페이스 할당 |
connect(s, <remote IP:port> | 로컬 소켓과 원격 호스트:포트 사이에 TCP 커넥션 생성 |
listen(s, ...) | 커넥션을 받아들이기 위해 로컬 소켓에 허용 표시 |
n = read(s, buffer, n) | 소켓으로부터 버퍼에 n바이트 읽기 시도 |
n = write(s, buffer, n) | 소켓으로부터 버퍼에 n바이트 쓰기기 시도 |
close(s) | TCP 커넥션 완전히 끊음 |
shutdown(s, <side> | TCP 커넥션의 입출력만 닫음 |
HTTP는 TCP 바로 위에 있는 계층이기 때문에
HTTP 트랜잭션의 성능은 그 아래 계층인 TCP의 성능에 영향을 받는다.
새로운 TCP 커넥션을 열 때면
TCP 소프트웨어는 커넥션을 맺기 위한 조건을 맞추기 위해 연속으로 IP 패킷을 교환한다.
SYN
(synchronize sequence numbers)라는 특별한 flag를 가진다.SYN
, ACK
)를 패킷에 포함ACK
)를 보낸다.