Was ist der Unterschied zwischen der Verwendung von netcat (nc) und curl für HTTP-Anfragen?

Was ist der Unterschied zwischen der Verwendung von netcat (nc) und curl für HTTP-Anfragen?

Ich verwende curl, um eine bestimmte URL anzufordern und erhalte die Antwort „200 OK“:

curl -v www.youtypeitwepostit.com
* About to connect() to www.youtypeitwepostit.com port 80 (#0)
*   Trying 54.197.246.21...
* Connected to www.youtypeitwepostit.com (54.197.246.21) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.youtypeitwepostit.com
> Accept: */*
>
< HTTP/1.1 200 OK
...

Wenn ich Kopfzeilen in einer Datei wie folgt speichere:

GET / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.youtypeitwepostit.com
Accept: */*

ncund versuchen Sie , den Befehl (netcat) auszuführen :

nc www.youtypeitwepostit.com 80 < file
HTTP/1.1 505 HTTP Version Not Supported
Connection: close
Server: Cowboy
Date: Wed, 02 Nov 2016 04:08:34 GMT
Content-Length: 0

Ich bekomme eine andere Antwort. Was ist der Unterschied und wie kann ich mit 200 OK erreichen nc?

Ich habe es mit verschiedenen HTTP-Versionen im Anforderungsheader versucht, habe versucht, die Anforderung manuell einzugeben, um falsche CRLFs zu vermeiden, habe versucht, optionale Header auszuschließen. Die Ergebnisse sind ähnlich.

Antwort1

Der entsprechende RFC,Hypertext Transfer Protocol (HTTP/1.1): Nachrichtensyntax und Routingenthält die Antwort auf Ihre Frage: dass jede Zeile einer HTTP-Anfrage mit CR/LF enden sollte.


Die Grammatik für das HTTPNachrichtenformatgibt an, dass jede Kopfzeile mit einem Wagenrücklaufzeichen ( 0x0din ASCII) gefolgt von einem Zeilenvorschubzeichen ( 0x0a) enden soll:

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]

Dies kommt deutlicher zum Ausdruck in der Beschreibung derAnforderungszeile:

Eine Anforderungszeile beginnt mit einem Methodentoken, gefolgt von einem einzelnen Leerzeichen (SP), dem Anforderungsziel, einem weiteren einzelnen Leerzeichen (SP), der Protokollversion und endet mit CRLF.

 request-line   = method SP request-target SP HTTP-version CRLF

Da curles speziell für HTTP-Anfragen entwickelt wurde, verwendet es bei HTTP-Anfragen bereits die entsprechenden Zeilenenden. Netcat ist jedoch ein allgemeineres Programm. Als Unix-Dienstprogramm verwendet es standardmäßig Zeilenvorschubzeichen für Zeilenenden, sodass der Benutzer sicherstellen muss, dass die Zeilen korrekt beendet werden.

Mit dem Dienstprogramm können Sie unix2dosdie Datei mit den Anforderungsheadern so konvertieren, dass Wagenrücklauf-/Zeilenvorschub-Endungen verwendet werden.

Wenn Sie die HTTP-Anfrage manuell eingeben möchten und über eine aktuelle Version von verfügen , sollten Sie die Option zur Verwendung für Zeilenenden ncverwenden :-CCRLF

nc -C www.youtypeitwepostit.com 80

Übrigens ist es erwähnenswert, dass die meisten gängigen Internetprotokolle (z. B. SMTP) CR/LF-Zeilenenden verwenden.


Beachten Sie, dass einige Webserver (z. B. Apache) nachsichtiger sind und Anforderungszeilen akzeptieren, die nur mit einem Zeilenvorschubzeichen abgeschlossen sind. Die HTTP-Spezifikation ermöglicht dies, wie in derRobustheit bei der NachrichtenanalyseAbschnitt:

Obwohl der Zeilenabschluss für die Startzeilen- und Header-Felder die Sequenz CRLF ist, KANN ein Empfänger ein einzelnes LF als Zeilenabschluss erkennen und ein vorhergehendes CR ignorieren.

verwandte Informationen