HTTP는 어떻게 stateless가됩니까?


26

HTTP는 상태 비 저장이라고합니다. 즉, 데이터 전송을 위해 정보를 저장할 필요가 없습니다.

그러나 HTTP는 상태 지향 TCP를 사용합니다.

그렇다면 HTTP는 어떻게 stateless가됩니까?


6
슈퍼 유저가 시작된 후 5 년이 지나지 않아 어떻게 되나요?
Peter Mortensen

대부분의 듀피가 StackOverflow에 있기 때문에? 나는 단지 추측하고있다.
trysis

8
그것이 (다른 사람의 사이에서) 케이블을 통해 실행해서 어느 것이 전기 프로토콜을하지 않습니다
하겐 폰 Eitzen

답변:


42

HTTP는 자체가 무국적 임에도 불구하고 자신을 전송하는 데 사용되는 하위 수준 프로토콜에 관심이없고 독립적입니다.

전송 기술은 TCP, Novell의 이전 SPX 또는 SCTP 또는 기타 꿈이 될 수 있으며 HTTP는 여전히 동일하게 작동합니다. HTTP에는 스트리밍 또는 연결 지향 프로토콜이 필요하며 해석 가능한 URL에 따라 달라 지지만 어떻게 달성되는지는 중요하지 않습니다.

이것이 계층 모델 또는 네트워크 스택이 존재 하는 이유 중 하나입니다 . 응용 프로그램 계층이 하위 계층과 관련이있을 필요는 없습니다.

하위 수준 프로토콜이 상태 저장이라고해서 그 위에 아무것도 자동으로 상태 저장이되거나 상태 저장이 필요한 것은 아닙니다.

HTTP 자체는 상태 비 저장입니다. 따라서 애플리케이션은 상태를 설정하기 위해 HTTP 위에 다른 계층을 구현해야합니다. 이것은 일반적으로 세션 쿠키로 수행됩니다.


1
라우팅은 tcp / ip 레벨에서 발생합니다.
Fiasco Labs

3
이 이미지가 잘 설명되어 있습니다. vichargrave.com/wp-content/uploads/2013/01/…
JakeGould

2
우연히도 HTTP가 기본 연결의 상태를 거의 무시한다는 사실 (거의 항상 TCP 임)은 다양한 HTTP2 접근 방식이 해결하려고 하는 주요 성능 부족 중 하나입니다 .
skolima

2
@Fiasco : 엄밀히 말하면 라우팅은 IP 수준에서 발생합니다. 라우팅은 인터넷 주소를 기반으로하며 기본 라우팅에는 TCP 계층의 정보가 사용되지 않습니다.
RedGrittyBrick

1
@skolima : 반면에, statelessness는 HTTP가 광범위하게 사용되는 가장 확장 가능하고 안정적인 프로토콜 인 이유입니다. HTTP는 항상 성능이 아닌 확장 성을 위해 명시 적으로 설계되었습니다 (예, 다른 것입니다). 잘못된 프로토콜을 사용하거나 프로토콜을 잘못 사용하는 것보다 대기 시간이 짧을 필요가 있다고 생각되면. HTTP2는 성능을 향상 시키려고하지만 상태 비 저장에 충실한 방식으로 수행합니다. 의도 된 용도로 사용될 때 상태 비 저장이 잘 설계된 HTTP 응용 프로그램의 병목 현상을 보지 못했습니다.
Lie Ryan

10

"HTTP는 상태 비 저장"은 각 HTTP 트랜잭션 (요청-응답 쌍)이 이전 요청-응답 쌍의 상태와 독립적으로 처리 될 수 있음을 의미합니다.

특정 요청-응답 쌍을 전송하려면 임의의 큰 블록과 임의의 큰 블록을 임의의 블록으로 전달할 수 있고 제한된 패킷 크기의 레이어를 통해 TCP를 상태 저장해야하는 프로토콜이 필요합니다.

그러나 트랜잭션 경계를 넘어서는 상태가 없습니다. 클라이언트는 연결을 끊고 다음 요청을 위해 새 연결을 설정할 수 있습니다. 사실 그것은 초기 버전에서 유일한 옵션이었고 클라이언트가 Connection: keep-alive헤더를 포함하지 않으면 여전히 작동합니다 .

다음 요청은 다른 서버에서 쉽게 처리 할 수 ​​있으며 서버가 상태를 유지할 필요가 없기 때문에 클라이언트는 알 수 없습니다 (응용 프로그램이 일반적으로 세션 형태로 HTTP 위에 자체 상태를 추가하지 않는 한 결과로 발생하는 합병증) 로드 밸런싱에서 HTTP에 상태 저장 프로토콜을 구축하는 것에 대한 처벌이 있습니다. 이는 사용량이 많은 서버의로드 균형 조정에서 활용됩니다.


can also easily be handled by different server and the client will never know기술적으로는 사실이지만 많은 웹 응용 프로그램에서 고정 세션을 사용하기 때문에로드 밸런서에서 향후 요청을 동일한 브라우징 세션에서 동일한 서버로 라우팅해야합니다. HTTP 관점에서 볼 때 세션은 관련이 없지만 마지막 문장은 최종 사용자 경험에 영향을 미치지 않음을 의미하며, 고정 세션에서는 잘못된 것입니다.
Brandon

1
@Brandon : 이러한 응용 프로그램은 HTTP를 기반으로 상태 저장 프로토콜을 구축하며 이에 대한 처벌입니다!
Jan Hudec

@Brandon : Gmail과 같은 많은로드 밸런싱 된 서버는 동일한 서버로 요청을 다시 보내지 않습니다. 대신 세션은 클러스터의 모든 서버가 액세스 할 수있는 공유 데이터베이스에 저장됩니다. 따라서 상태는 서버가 아니라 데이터베이스에 의해 처리됩니다.
slebetman

@ slebetman : 예, 뭐든지. HTTP 자체에는 그러한 상태가 없으므로 HTTP의 경우 간단합니다. 응용 프로그램이 자신의 상태를 추가하면 싸움입니다.
Jan Hudec 8

그렇습니다, 나는 모든 것을 말하지 않았습니다. 나는 몇 가지를 말했다. 나는 개인적으로 끈적 끈적한 세션을 피하고 가능하면 세션을 완전히 피하는 것을 선호합니다. 그럼에도 불구하고 모든 사람에게 이상적인 소프트웨어는 존재하지 않습니다.
Brandon

2

HTTP의 "상태 비 저장"특성은 계층에서 상태 정보가 생성되거나 사용되지 않음을 의미합니다 .

HTTP 인증과 같은 몇 가지 인스턴스에서이를 볼 수 있으며 자격 증명은 모든 요청과 함께 전송되며 영구 연결은 실제로 최적화입니다 (즉, 자격 증명을 보내면 서버는 요청 후에도 잊어 버립니다) 연결이 열립니다).

반대로 쿠키 기반 로그인 메커니즘은 상태 저장이지만 HTTP의 일부는 아닙니다.


1

당신은 그것을 하나의 내부에 가지고있는 러시아 인형 세트 (또는 원하는 경우 상자)로 이해해야합니다. TCP는 HTTP를 "내부"로 운반하지만 TCP는 그것의 특징이나 기능에 신경 쓰지 않습니다.

전체 그림을 얻으려면 OSI 모델 에 대해 더 명확하게 읽을 것을 권장 합니다.

TCP는 OSI 모델에서 HTTP 아래에 몇 개의 계층에 위치하며 각 계층은 실제로 다른 프로토콜에 해당합니다.

우리의 경우 HTTP는 프리젠 테이션 및 애플리케이션 계층에 있고 TCP는 전송 계층에 있습니다. 또는 TCP / IP 모델을 사용하는 경우 TCP 및 IP 프로토콜 모두 응용 프로그램 및 프리젠 테이션 계층의 네트워크 링크 계층과 HTTP에 있습니다.


1
OSI 모델의 문제점은 이제 이론적이라는 것입니다 (실제로 구현하려고 시도했지만 복잡성으로 인해 시장에서 실패했습니다). 실제로 TCP와 HTTP 사이에는 계층이 없습니다. 게다가 프리젠 테이션 레이어는 HTTP가 아닌 HTML입니다.
MSalters

TCP / IP 모델에서 TCP는 네트워크 계층에 존재하지 않습니다. 나중에 네트워크에있는 IP의 전송 계층에 있습니다. "TCP 모델"에 대한 첫 번째 Google 히트는 technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Brandon

@MSalters : TLS는 레이어가 아닙니까?
grawity

1
@MSalters : HTTPS가 TLS에 의해 터널링되는 HTTP에 의해 주어진 이름이라는 것을 알고 있습니까? 이러한 TLS는 HTTP 및 TCP의 최상위 계층이므로 TLS / SSL + HTTP 콤보는 HTTPS라고합니다.
slebetman

1
또한 TLS / HTTP 콤보에 대한 또 다른 새로운 이름이 있습니다. HTTP 트래픽을 전달하는 TLS가 가상 소켓 / 스트림 멀티플렉싱을 구현하는 경우이를 SPDY라고하지만 브라우저의 URL은 여전히 ​​HTTPS입니다.
slebetman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.