Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 11671|Απάντηση: 1

Content-Length του πρωτοκόλλου Http

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2019-9-24 16:43:20 | | | |
πρόλογος

Το πρωτόκολλο HTTP είναι ένα από τα πιο σημαντικά πρωτόκολλα στο Διαδίκτυο, αν και φαίνεται απλό, αλλά στην πράξη αντιμετωπίζει συχνά προβλήματα και το έχουμε συναντήσει αρκετές φορές. Υπάρχουν μεγάλες συνδέσεις και ανάλυση πακέτων. Δεν μπορείτε να γνωρίζετε τίποτα για το πρωτόκολλο HTTP, πρέπει να το κατανοήσετε πλήρως. Έγραψα λοιπόν αυτή τη σειρά για να μοιραστώ τα προβλήματα και τις εμπειρίες του πρωτοκόλλου HTTP.



Το πρωτόκολλο HTTP έχει μια κεφαλίδα και ένα σώμα τόσο για τα πακέτα αίτησης όσο και για τα πακέτα απάντησης και το σώμα είναι ο πόρος που θέλετε να λάβετε, όπως μια σελίδα html, μια εικόνα jpeg και η κεφαλίδα χρησιμοποιείται για τη δημιουργία ορισμένων συμβάσεων. Για παράδειγμα, ο πελάτης και ο διακομιστής συμφωνούν σε ορισμένες μορφές μετάδοσης και ο πελάτης λαμβάνει πρώτα την κεφαλίδα, γνωρίζει ορισμένες πληροφορίες μορφής και μετά αρχίζει να διαβάζει το σώμα.

Πελάτης: Accept-Encoding:gzip (συμπιέστε το για μένα, χρησιμοποιώ την κίνηση, κατεβάστε το πρώτα και μετά αποσυμπιέστε το σιγά σιγά)

Διακομιστής 1: Κωδικοποίηση περιεχομένου: null (Χωρίς κεφαλίδα κωδικοποίησης περιεχομένου.) Δεν δίνω συμπίεση, η CPU δεν είναι δωρεάν, το θέλετε)

Διακομιστής 2: Κωδικοποίηση περιεχομένου: gzip (εξοικονομήστε επισκεψιμότητα για εσάς, συμπιέστε την)
Πελάτης: Σύνδεση: keep-alive (Μεγάλος αδερφός, επιτέλους φτιάξαμε μια σύνδεση TCP, θα τη χρησιμοποιήσουμε την επόμενη φορά)

Διακομιστής 1: Σύνδεση: keep-alive (δεν είναι εύκολο, συνεχίστε να χρησιμοποιείτε)

Διακομιστής 2: Σύνδεση: κλείσιμο (Όποιος συνεχίσει να το χρησιμοποιεί μαζί σας, το TCP μας είναι εφάπαξ και θα πρέπει να επανασυνδεθούμε την επόμενη φορά που θα το βρούμε)
Το πρωτόκολλο HTTP δεν έχει τρεις χειραψίες και όταν ένας πελάτης ζητά πόρους από τον διακομιστή, υπερισχύει η πλευρά του διακομιστή. Υπάρχουν επίσης ορισμένες κεφαλίδες που δεν έχουν διαδικασία διαπραγμάτευσης, αλλά ο διακομιστής λέει απευθείας στον πελάτη τι να κάνει. Για παράδειγμα, το Content-Length παραπάνω είναι αυτό που λέει ο διακομιστής στον πελάτη πόσο μεγάλο είναι το σώμα. Αλλά! Ο διακομιστής ενδέχεται να μην είναι σε θέση να σας πει ακριβώς πόσο μεγάλο είναι το σώμα εκ των προτέρων. Ο διακομιστής πρέπει πρώτα να γράψει την κεφαλίδα και μετά το σώμα, εάν θέλετε να γράψετε την περίπτωση του σώματος στην κεφαλίδα, πρέπει να γνωρίζετε εκ των προτέρων το μέγεθος του σώματος. Εάν το σώμα δημιουργείται δυναμικά, ο διακομιστής θα ολοκληρώσει και στη συνέχεια θα αρχίσει να γράφει την κεφαλίδα, κάτι που απαιτεί πολλά πρόσθετα έξοδα, επομένως ενδέχεται να μην υπάρχει μήκος περιεχομένου στην κεφαλίδα.

Πώς λοιπόν γνωρίζει ο πελάτης το μέγεθος του σώματος; Ο διακομιστής σας ενημερώνει με τρεις τρόπους.


1. Ο διακομιστής γνωρίζει ήδη το μέγεθος του πόρου και σας ενημερώνει μέσω της κεφαλίδας μήκους περιεχομένου.

Content-Length:1076(body的大小是1076B,你读取1076B就可以完成任务了)

Transfer-Encoding: null


2. Ο διακομιστής δεν μπορεί να γνωρίζει εκ των προτέρων το μέγεθος του πόρου ή δεν είναι πρόθυμος να ξοδέψει πόρους για να υπολογίσει το μέγεθος του πόρου εκ των προτέρων, επομένως θα προσθέσει μια κεφαλίδα στο μήνυμα απάντησης http που ονομάζεται Transfer-Encoding:chunked, που σημαίνει μεταφορά μπλοκ. Κάθε μπλοκ χρησιμοποιεί μια σταθερή μορφή, με το μέγεθος του μπλοκ μπροστά, τα δεδομένα πίσω από αυτό και, στη συνέχεια, το τελευταίο μπλοκ με μέγεθος 0. Με αυτόν τον τρόπο, όταν ο πελάτης αναλύει, πρέπει να δώσει προσοχή στην αφαίρεση ορισμένων άχρηστων πεδίων.

Content-Length:null

Transfer-Encoding:chunked (接下来的body我要一块一块的传,每一块开始是这一块的大小,等我传到大小为0的块时,就没了)


3. Ο διακομιστής δεν γνωρίζει το μέγεθος του πόρου και δεν υποστηρίζει τη λειτουργία τμηματικής μετάδοσης, επομένως δεν υπάρχει ούτε η κεφαλίδα μήκους περιεχομένου ούτε η κεφαλίδα κωδικοποίησης μεταφοράς. Αυτή τη στιγμή, η κεφαλίδα που επιστρέφεται από τον διακομιστή πρέπει να είναι κοντά.

Content-Length:null

Transfer-Encoding:null

Connection:close(我不知道大小,我也用不了chunked,啥时候我关了tcp连接,就说明传输结束了)





Προηγούμενος:Λεπτομερής ερμηνεία του Content-Length στο πρωτόκολλο HTTP
Επόμενος:Πρωτόκολλο HTTP Μεταφορά-Κωδικοποίηση (τεμαχισμένο)
Δημοσιεύτηκε στις 2019-9-24 17:16:57 |
Ευχαριστώ, σπιτονοικοκύρη
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com