您的位置:js12345金沙官网登入 > 网络编程 > Socket编程中遇到的CRLFjs12345金沙官网登入

Socket编程中遇到的CRLFjs12345金沙官网登入

2019-10-02 10:00

Problem

先说问题:在 Socket 编程的过程中,我遇到了rnrn且不知道为何物,查找资料之后发现背后的故事还是很有趣的,决定拿上来和大家分享。

今天在尝试补齐之前《Computer Network》的应用层编程作业,第一题是这样的:要求开发一个简单的 Web 服务器,从浏览器请求一个文件后,我们服务器可以返回这个文件的内容,如果找不到,返回 404。(《Computer Network: A Top-Down Approach Sixth Edition》中文版 P120 作业1)

然后我在编写响应报文的时候,遇到换行的问题,发现别人的解决方案是rnrn,感到疑惑。

来自微信公众号:开点工作室(ID:kaidiancs)

Solution

众所周知,一个 HTTP 响应报文的组成是这样的:

HTTP/1.1 200 OK.....

第一行是状态行,在返回状态行以后,有一个换行的操作。是这里用了rnrn,又称作 CRLFjs12345金沙官网登入,。这里涉及到两个内容:

  • RFC 文档中规定,HTTP message 中,message-header 和 message-body 中必须间隔两个 CRLF。

    js12345金沙官网登入 1

  • CRLF 是指回车(Carriage Return)+换行(Line Feed)。我以前一直以为回车和换行是一个概念,真心长见识了。回车的意思是,将当前光标移动到同一行中的最左边;换行的意思是,保持当前光标的水平位置位置不变,换到下一行。这个历史竟然是涉及到一个叫“电传打印机”的玩意儿,我会贴链接在后面,感兴趣的各位可以看一下。

用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议HTTP(HyperTextTransfer Protocol)负责完成的。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送,能够在万维网上进行文本、声音、图像、视频等各种信息的交换。

Summary

依稀记得研一好像有 Socket 编程的实验,当时没认真做,所以现在又踩了这个坑。

还请各位学霸们多多嘲讽!!!

HTTP协议也是工作在客户机/服务器模式下,分为HTTP客户端和HTTP服务器两个部分,双方每次进行交互,都是由客户端发出的请求和服务器端发出的响应构成。HTTP协议规定的用户使用浏览器访问万维网的过程可以总结为:

Reference

  • stackoverflow - what is the character of rnrn in nodejs TCP/IP

  • RFC 文档

  • 回车 换行 0x0D 0x0A CR LF r n的来龙去脉

1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;

2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;

3.浏览器与网页所在服务器建立TCP连接;

4.浏览器发送HTTP请求报文,获取目标网页的文件;

5.服务器发送HTTP响应报文,将目标网页文件发送给浏览器;

6.释放TCP连接;

7.浏览器将网页的内容包括文本、图像、声音等显示呈现在用户计算机屏幕。

HTTP协议是无连接的,它使用面向连接的TCP协议所提供的服务。同时,HTTP协议也是无状态的,即服务器端不记录客户端访问的时间和次数。最初的HTTP协议版本是1.0版,使用非持续连接(nonpersistentconnection)。每传输一个对象都需要利用1个往返时间RTT建立TCP连接,用1个往返时间RTT申请并传输回对象,即平均用2个往返时间RTT获取一个对象。目前使用比较广泛的是HTTP协议的1.1版本(HTTP/1.1),其在默认情况下使用持续连接(persistentconnection),即利用同一个TCP连接传输多个对象。

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。请求报文是从客户端向服务器发送的报文,响应报文是从服务器到客户端的报文。下面分别介绍请求报文和响应报文的具体格式。

1.HTTP请求报文格式

HTTP请求报文的由请求行、请求头部行、空行和请求数据四部分构成,具体格式如下所示:

(请求行)方法名+空格+URL+空格+版本+回车换行(rn)

(请求头部行1)关键字+“:”+空格+值+回车换行(rn)

……

(请求头部行N)关键字+“:”+空格+值+回车换行(rn)

(空行)回车换行(rn)

(请求数据)……

(1)请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。最后由回车和换行表示请求行结束。例如:

GET www.sdu.edu.cn  HTTP/1.1回车换行(rn)

其中“方法”字段表示该请求报文希望服务器做什么,请求报文的类型就是由所采用的方法决定的。HTTP请求报文的主要方法包括:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT等。最常见的方法有GET和HEAD。

GET是最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。GET方式不适合传送私密数据和大量数据。

HEAD的功能与GET相似,只是服务器端接收到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

(2)请求头部行(header)

请求头部行包括若干行,每行由关键字及其值构成的,关键字和值用英文冒号“:”分隔,每一行都由回车换行表示结束。请求头部通知服务器有关于客户端请求的信息,典型的请求头部关键字有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Accept-Language:客户端可识别的语言类型

Host:请求的主机名。

Connection:告知服务器发送完文档后释放连接还是保持连接。

(3)空行

最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部了。

本文由js12345金沙官网登入发布于网络编程,转载请注明出处:Socket编程中遇到的CRLFjs12345金沙官网登入

关键词: