背景
了解HTTP
一直是从各种渠道来了解,但是一直都没有真正的从它实际的样子来了解这个协议,这次借着写Mock
的机会,从TCP
的层面来理解一下它。
初步窥视
首先用Python
写一个基本的TCP Server
,然后用浏览器打开这个地址,收到的数据不直接print
,而是用print repr()
打印出来,类似这样:print repr(recv)
。这样就能看到它原来的样子。
''GET /test/sven?testname=sven HTTP/1.1\r\nHost: localhost:31500\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,vi;q=0.7\r\nCookie: token=eyJ2ZXIiOiJ2MiIsInVpZCI6Ijdh'
可以看到,它的所有信息,都是用\r\n
来分割的。那么问题来了,为什么是\r\n
?
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“\