ทำไมถึงกล่าวว่า“ HTTP เป็นโปรโตคอลไร้สัญชาติ”?


170

HTTP มีคุกกี้ HTTP คุกกี้ช่วยให้เซิร์ฟเวอร์ติดตามสถานะผู้ใช้จำนวนการเชื่อมต่อการเชื่อมต่อล่าสุด ฯลฯ

HTTP มีการเชื่อมต่อแบบต่อเนื่อง (Keep-Alive) ซึ่งสามารถส่งคำขอได้หลายรายการจากการเชื่อมต่อ TCP เดียวกัน


3
พื้นที่อื่นที่ฉันไม่เห็น "ไร้สัญชาติ" อยู่ในการอนุญาต - โดยเฉพาะอย่างยิ่งการมอบอำนาจ ดูเหมือนว่ามันเป็นของรัฐในระหว่างการเจรจา สำหรับการรับรองความถูกต้องของ NTLM ไคลเอนต์จำเป็นต้องจดจำชนิดของการรับรองความถูกต้องของพร็อกซีและเซิร์ฟเวอร์จะต้อง stateful เนื่องจากมีลำดับของประเภทข้อความ NTLM ดังนั้นฉันไม่แน่ใจว่าฉันเข้าใจคำตอบหรือไม่
Lindsay Morsillo

1
ตอนนี้ฉันควรจะเพิ่ม HTTP / 1.1 เพราะฉันคิดว่า HTTP / 2 มีสถานะ
Jose Nobile

4
HTTP / 2 เป็น stateful HTTP 1 คือไร้สัญชาติ การเพิ่มเติมภายหลังมีไว้สำหรับ HTTP 1 เช่นคุกกี้เพิ่มสถานะ ส่วนเพิ่มเติมเหล่านี้ไม่ได้แยกจากข้อกำหนด "HTTP" HTTP 1 นี่คือเหตุผลที่ HTTP 1 ถูกกล่าวว่าเป็นโปรโตคอลไร้สัญชาติแม้ว่าในทางปฏิบัติแล้วมันไม่ได้เป็นเช่นนั้น HTTP / 2 ในทางกลับกันได้รับการออกแบบด้วยองค์ประกอบ stateful อบไม่จำเป็นต้องเพิ่มเติมเพื่อตอบสนองความต้องการของการติดป้าย "stateful"
Zamicol

นอกจากนี้ยังเกี่ยวข้องกับ: stackoverflow.com/questions/11067500/... stackoverflow.com/questions/36178447/...
แอนดรู

คำตอบ:


130

แม้ว่าจะสามารถส่งคำขอได้หลายครั้งผ่านการเชื่อมต่อ HTTP เดียวกัน แต่เซิร์ฟเวอร์ไม่ได้แนบความหมายพิเศษใด ๆ กับการมาถึงผ่านซ็อกเก็ตเดียวกัน นั่นเป็นสิ่งที่มีประสิทธิภาพเพียงอย่างเดียวโดยมีจุดประสงค์เพื่อลดเวลา / แบนด์วิดท์ที่จะใช้ในการสร้างการเชื่อมต่อสำหรับการร้องขอแต่ละครั้ง

เท่าที่เกี่ยวข้องกับ HTTP พวกเขาทั้งหมดยังคงแยกคำขอและต้องมีข้อมูลเพียงพอด้วยตนเองเพื่อตอบสนองคำขอ นั่นคือสาระสำคัญของ "ไร้สัญชาติ" คำขอจะไม่เชื่อมโยงซึ่งกันและกันขาดข้อมูลที่แบ่งปันที่เซิร์ฟเวอร์รู้ซึ่งส่วนใหญ่เป็นรหัสเซสชันในคุกกี้


1
จะเกิดอะไรขึ้นเมื่อเซิร์ฟเวอร์จดจำเซสชัน (ฝั่งเซิร์ฟเวอร์) และปรับแต่งประสบการณ์ผู้ใช้ตามนั้น
NurShomik

3
@NurShomik: ดูstackoverflow.com/a/3521393/319403สำหรับคำอธิบายว่าเซสชันทำงานอย่างไร
cHao

12
@Andrew: HTTP ไม่ใช่ "built on" TCP และสถานะของ TCP ไม่ใช่ HTTP ทั้งสองเป็นโปรโตคอลที่แยกจากกันอย่างสิ้นเชิงในชั้นที่แตกต่างกันในกอง คุณสามารถให้บริการ HTTP ผ่านไปป์ที่มีชื่อถ้าคุณต้องการหรือแม้กระทั่งโดยการส่งไฟล์ไปรอบ ๆ ถ้าคุณมี masochists มากพอที่จะยอมรับมันและมันจะทำงานได้อย่างแม่นยำเพราะ HTTP เป็น transport-protocol-agnostic ในระดับนั้นมันเป็นเพียงแค่การร้องขอและการตอบกลับ ซึ่งทำให้ HTTP นั้นไร้สถานะโดยไม่คำนึงถึงสถานะใดที่อาจถูกใช้ / ดูแล / ต้องการโดยโปรโตคอลระดับล่างหรือสูงกว่า
cHao

@cHao โอเคฉันจะยอมรับ ถ้าเรานิยามสถานะไร้สัญชาติว่า "ไม่จำเป็นต้องมีสถานะเพื่อดำเนินการ" (ดูคำตอบของ dimo414 ด้านล่างตัวเลือกการแสดงรายการสำหรับสถานะภายใน HTTP ที่อ้างจาก Wikipedia) และถ้าเราดูแต่ละโปรโตคอลอย่างเคร่งครัดและไม่ยึดตามชั้นล่าง จากนั้นใช่ฉันสามารถยอมรับ HTTP ได้ว่า "ไร้สัญชาติ"
Andrew

101

จากWikipedia :

HTTP เป็นโปรโตคอลไร้สัญชาติ โปรโตคอลไร้สัญชาติไม่ต้องการให้เซิร์ฟเวอร์เก็บข้อมูลหรือสถานะเกี่ยวกับผู้ใช้แต่ละรายในช่วงระยะเวลาของการร้องขอหลายครั้ง

แต่เว็บแอปพลิเคชั่นบางตัวอาจต้องติดตามความคืบหน้าของผู้ใช้จากหน้าหนึ่งไปอีกหน้าหนึ่งเช่นเมื่อต้องใช้เว็บเซิร์ฟเวอร์ในการปรับแต่งเนื้อหาของหน้าเว็บสำหรับผู้ใช้ โซลูชั่นสำหรับกรณีเหล่านี้ ได้แก่ :

  • การใช้งานคุกกี้ HTTP
  • เซสชันด้านเซิร์ฟเวอร์
  • ตัวแปรที่ซ่อนอยู่ (เมื่อหน้าปัจจุบันมีฟอร์ม) และ
  • การเขียน URL ใหม่โดยใช้พารามิเตอร์ที่เข้ารหัส URI เช่น /index.php?session_id=some_unique_session_code

สิ่งที่ทำให้โปรโตคอลไร้สัญชาติคือเซิร์ฟเวอร์ไม่จำเป็นต้องติดตามสถานะมากกว่าการร้องขอหลายครั้งไม่ใช่ว่าจะไม่สามารถทำได้หากต้องการ สิ่งนี้ช่วยลดความยุ่งยากในการทำสัญญาระหว่างไคลเอนต์และเซิร์ฟเวอร์และในหลาย ๆ กรณี (เช่นการให้บริการข้อมูลคงที่ผ่าน CDN) ช่วยลดปริมาณข้อมูลที่จำเป็นต้องมีการถ่ายโอน หากเซิร์ฟเวอร์จำเป็นต้องรักษาสถานะของการเข้าชมของลูกค้าโครงสร้างของการออกและการตอบสนองต่อการร้องขอจะมีความซับซ้อนมากขึ้น ความเรียบง่ายของโมเดลเป็นหนึ่งในคุณสมบัติที่ยอดเยี่ยมที่สุด


21

เนื่องจากโปรโตคอลไร้สัญชาติไม่ต้องการให้เซิร์ฟเวอร์เก็บข้อมูลเซสชันหรือสถานะเกี่ยวกับพันธมิตรการสื่อสารแต่ละรายในช่วงระยะเวลาของการร้องขอหลายครั้ง

HTTP เป็นโปรโตคอลไร้สัญชาติซึ่งหมายความว่าการเชื่อมต่อระหว่างเบราว์เซอร์และเซิร์ฟเวอร์จะหายไปเมื่อการทำธุรกรรมสิ้นสุดลง


2
แต่ HTTP สามารถบันทึกข้อมูลในเซิร์ฟเวอร์โดยใช้คุกกี้ HTTP พร้อมใช้งานไม่ปิดการเชื่อมต่อกับคำขอแต่ละรายการ
Jose Nobile

3
ลองดูบทความนี้: - ecst.csuchico.edu/~amk/foo/advjava/notes/servlets/Cookies.html
Rahul Tripathi

18
การบันทึกข้อมูลบนเซิร์ฟเวอร์ไม่ได้หมายความว่าการเชื่อมต่อยังคงมีอยู่อย่างต่อเนื่อง
srijan

1
@srijan ดีไม่มี ดังนั้น? ไม่มีใครอ้างสิทธิ์เป็นอย่างอื่น
Mark Amery

10

HTTPถูกเรียกว่าเป็นstateless protocolเพราะแต่ละคำขอถูกดำเนินการอย่างเป็นอิสระโดยไม่ทราบว่ามีการร้องขอใด ๆ ที่ดำเนินการมาก่อนซึ่งหมายความว่าเมื่อธุรกรรมสิ้นสุดการเชื่อมต่อระหว่างเบราว์เซอร์และเซิร์ฟเวอร์ก็จะสูญหายเช่นกัน

สิ่งที่ทำให้โปรโตคอลstatelessคือในการออกแบบดั้งเดิมHTTPนั้นค่อนข้างง่ายfile transfer protocol:

  1. ทำการร้องขอไฟล์ชื่อ URL
  2. รับไฟล์ตอบกลับ
  3. ปลด

ไม่มีการรักษาความสัมพันธ์ระหว่างการเชื่อมต่อหนึ่งกับอีกแม้จากไคลเอนต์เดียวกัน สิ่งนี้ช่วยลดความยุ่งยากในการทำสัญญาระหว่างไคลเอนต์และเซิร์ฟเวอร์และในหลาย ๆ กรณีจะลดปริมาณข้อมูลที่ต้องโอนให้น้อยที่สุด


3

หากโปรโตคอล HTTP นั้นถูกกำหนดให้เป็นโปรโตคอลแบบเต็มรัฐหน้าต่างเบราว์เซอร์จะใช้การเชื่อมต่อเดียวเพื่อสื่อสารกับเว็บเซิร์ฟเวอร์สำหรับการร้องขอหลายครั้งที่มอบให้กับเว็บแอปพลิเคชัน พวกเขาอยู่ในสถานะว่างเป็นเวลานานซึ่งอาจสร้างสถานการณ์ในการเข้าถึงการเชื่อมต่อสูงสุดของเว็บเซิร์ฟเวอร์แม้ว่าการเชื่อมต่อส่วนใหญ่ในไคลเอนต์จะไม่ได้ใช้งาน


1
HTTP รักษาสถานะไว้เรียบร้อยแล้วซึ่งหมายความว่าเซิร์ฟเวอร์ไม่ปิดการเชื่อมต่อและไคลเอนต์สามารถส่งคำขอจำนวนมากในการเชื่อมต่อเดียวกัน
Jose Nobile

3

HTTP เป็น connectionless และเป็นผลลัพธ์โดยตรงที่ HTTP เป็นโปรโตคอลไร้สัญชาติ เซิร์ฟเวอร์และไคลเอนต์ทราบกันเฉพาะระหว่างการร้องขอปัจจุบัน หลังจากนั้นทั้งคู่ก็ลืมกันและกัน เนื่องจากลักษณะของโปรโตคอลนี้ลูกค้าและเบราว์เซอร์ไม่สามารถเก็บข้อมูลระหว่างคำขอที่แตกต่างกันทั่วหน้าเว็บ


1

ไร้สัญชาติคืออะไร?

เมื่อมีการร้องขอและตอบกลับไปยังลูกค้าการเชื่อมต่อจะถูกยกเลิกหรือถูกยกเลิก เซิร์ฟเวอร์จะลืมทุกอย่างเกี่ยวกับผู้ร้องขอ

ทำไมไร้สัญชาติ?

เว็บเลือกที่จะไปหาโปรโตคอลไร้สัญชาติ มันเป็นตัวเลือกอัจฉริยะเพราะเป้าหมายดั้งเดิมของเว็บคืออนุญาตให้มีการแสดงเอกสาร (หน้าเว็บ) ในจำนวนที่ไม่มาก ของคนที่ใช้ฮาร์ดแวร์พื้นฐานมากสำหรับเซิร์ฟเวอร์

การรักษาการเชื่อมต่อที่ใช้เวลานานจะทำให้สิ้นเปลืองทรัพยากรมาก

หากเว็บได้รับเลือกโปรโตคอล stateful แล้วโหลดบนเซิร์ฟเวอร์จะเพิ่มขึ้นเพื่อรักษาการเชื่อมต่อของผู้เข้าชม


1

HTTPไร้สัญชาติ TCPเป็นของรัฐ ไม่มีสิ่งที่เรียกว่าHTTP connectionแต่เพียงและHTTP request เราไม่จำเป็นอะไรที่จะได้รับการรักษาที่จะทำให้อีกHTTP response HTTP requestส่วนหัวการเชื่อมต่อที่เป็น"keep-alive"หมายถึงTCPจะถูกนำมาใช้ใหม่โดยการHTTPร้องขอและการตอบสนองที่ตามมาแทนการยกเลิกการเชื่อมต่อและการสร้างTCPการเชื่อมต่อใหม่ตลอดเวลา


0

ฉันคิดว่ามีคนเลือกชื่อที่โชคร้ายมากสำหรับแนวคิด STATELESS และนั่นเป็นสาเหตุที่ทำให้เกิดความเข้าใจผิดทั้งหมด มันไม่เกี่ยวกับการจัดเก็บทรัพยากรชนิดใด ๆ แต่เกี่ยวกับความสัมพันธ์ระหว่างไคลเอนต์และเซิร์ฟเวอร์

ลูกค้า: ฉันกำลังรักษาทรัพยากรทั้งหมดไว้ที่ข้างของฉันและส่ง "รายการ" ของรายการสำคัญทั้งหมดที่ต้องดำเนินการ ทำงานของคุณ

เซิร์ฟเวอร์: เอาล่ะ .. ขอให้ฉันรับผิดชอบในการกรองสิ่งที่สำคัญเพื่อให้คุณได้คำตอบที่เหมาะสม

ซึ่งหมายความว่าเซิร์ฟเวอร์เป็น "ทาส" ของลูกค้าและต้องลืมเกี่ยวกับ "เจ้านาย" ของเขาหลังจากการร้องขอแต่ละครั้ง ที่จริงแล้ว STATELESS อ้างถึงสถานะของเซิร์ฟเวอร์เท่านั้น

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.