前面我們說(shuō)過(guò)李爵士建立了第一個(gè)網(wǎng)頁(yè)兼呵、第一個(gè)瀏覽器兔辅、第一個(gè)服務(wù)器腊敲。前面兩個(gè),我們都見(jiàn)過(guò)了,但是服務(wù)器我們目前沒(méi)有親自實(shí)現(xiàn)過(guò)匕荸,所以有必要了解一下苔悦,服務(wù)器的一些基礎(chǔ)知識(shí)。
以下是手寫(xiě)服務(wù)器腳本的必備知識(shí)
- HTTP是建立在TCP/IP的基礎(chǔ)之上的
- TCP是什么
TCP 傳輸控制協(xié)議(Transmission Control Protocol)
- TCP是什么
面試必問(wèn)的兩道題
1没宾、TCP和UDP的區(qū)別
TCP是可靠的、面向連接的沸柔,相對(duì)UDP速度慢循衰,UDP是不可靠的,不是面向連接的褐澎,速度快会钝。可靠是指你的請(qǐng)求成不成功都會(huì)有響應(yīng)工三,成功了就告訴你ok,失敗了也告訴你訪問(wèn)失敗迁酸,面向連接是指每次必須發(fā)起一個(gè)請(qǐng)求,這端是瀏覽器徒蟆,另一端是你要訪問(wèn)的地址
TCP可以看成是把石子扔到水里胁出,UDP是把石頭扔進(jìn)草垛里面
2、TCP的三次握手是啥
第一次 客戶端問(wèn)服務(wù)器段审,我能連接嗎
第二次 服務(wù)器回答說(shuō)全蝶,我準(zhǔn)備好了,可以連接啦
第三次 客戶端說(shuō)寺枉,那我就真的連接嘍
上述兩個(gè)面試題可以仔細(xì)閱讀這兩篇文章 TCP與UDP的區(qū)別抑淫、TCP三次握手詳解
-
路由器的基礎(chǔ)
只要我們?cè)诨ヂ?lián)網(wǎng)中,就要用到IP 網(wǎng)絡(luò)協(xié)議(Internet Protocol),IP有分為內(nèi)網(wǎng)IP和外網(wǎng)IP,它們的分界線就是路由器姥闪。
內(nèi)網(wǎng)和外網(wǎng).png - 內(nèi)網(wǎng)之間可以自由溝通始苇,外網(wǎng)之間自由溝通。但是內(nèi)外網(wǎng)不能直接溝通筐喳,必須通過(guò)路由催式,路由是一夫當(dāng)關(guān)萬(wàn)夫莫開(kāi),也叫網(wǎng)關(guān)避归。
- 當(dāng)路由器連上電信的服務(wù)器荣月,就會(huì)獲得一個(gè)外網(wǎng)IP(14.17.32.211),當(dāng)你重啟的時(shí)候又會(huì)重新分配一個(gè)。所以大多數(shù)的公司梳毙,會(huì)買(mǎi)一個(gè)固定的哺窄。
- 好了,此時(shí)路由和外界可以聯(lián)通了,那么如何和你聯(lián)通呢萌业。答案就是 內(nèi)網(wǎng)
- 路由器會(huì)在你家里創(chuàng)建一個(gè)內(nèi)網(wǎng)坷襟,內(nèi)網(wǎng)中的設(shè)備使用內(nèi)網(wǎng) IP,一般來(lái)說(shuō)這個(gè) IP 的格式都是 192.168.xxx.xxx生年。路由器還會(huì)給自己優(yōu)先分配一個(gè)好的內(nèi)網(wǎng)IP(192.168.1.1)婴程,你就有可能是192.168.1.2。
-
現(xiàn)在路由器有兩個(gè) IP晶框,一個(gè)外網(wǎng) IP(14.17.32.211)和一個(gè)內(nèi)網(wǎng) IP(192.168.1.1)
具有雙重間諜的作用排抬。它是內(nèi)外溝通的橋梁 - 除此之外,還有一個(gè)localhost127.0.0.1和0.0.0.0這兩個(gè)很重要的IP
可以在你的hosts文件里面修改localhost文件 - 端口和 ip授段、各種服務(wù)
你想要訪問(wèn)一個(gè)設(shè)備(前提是你使用的是 TCP 或 UDP 協(xié)議。還記得嗎番甩,HTTP 就使用了 TCP)侵贵,只指定 IP 是不夠的,還必須指定端口(Port)缘薛。
端口就是一個(gè)編號(hào)窍育,并不是物理設(shè)備。因?yàn)橐粋€(gè)設(shè)備里面有很多功能宴胧,你不知道用哪個(gè)功能漱抓,所以要用端口來(lái)區(qū)分你要哪個(gè)服務(wù)。
-兩個(gè)問(wèn)題
1恕齐、我怎么知道使用哪個(gè)端口
詳見(jiàn)0-1023端口詳解
2乞娄、總共有多少個(gè)端口啊
每個(gè)機(jī)器一共有 65535(2的16次方減1)個(gè)端口(這是協(xié)議規(guī)定的)。不過(guò)這些端口的使用由一些規(guī)定
1显歧、0 到 1023(2的10次方減1)號(hào)端口是留給系統(tǒng)使用的仪或,你只有擁有了管理員權(quán)限后,才能使用這 1024 個(gè)端口士骤。
2范删、其他端口可以給普通用戶使用
3、如果一個(gè)端口正在提供服務(wù)拷肌,也就是被占用了到旦,那么就不能再使用這個(gè)端口。除非你先停掉正在占用這個(gè)端口的服務(wù)巨缘。以后你們會(huì)經(jīng)常遇到這個(gè)問(wèn)題添忘。
- 綜上所述,要想訪問(wèn)一個(gè)地址带猴,必須提供IP和端口號(hào)N艉骸!!
IP通過(guò)DNS解析你的域名靶病,給你会通。端口號(hào)必須給出
問(wèn)題來(lái)了
我訪問(wèn)http://qq.com 時(shí)并沒(méi)有提供端口號(hào),為什么我依然可以訪問(wèn)
因?yàn)闉g覽器給你加上了80端口
用node.js腳本搭建最簡(jiǎn)單的服務(wù)器
- 用server接收請(qǐng)求
- 2.用server發(fā)揮響應(yīng)娄周,完成網(wǎng)頁(yè)的解析
核心代碼如下所示涕侈,可以模擬一個(gè)微型的服務(wù)器
一定要注意,response.setHeader('ContentType', 'text/html;charset=utf-8')
這是告訴瀏覽器兩件事煤辨,一是設(shè)置頭文件裳涛,告訴瀏覽器響應(yīng)的第四部分按照什么格式來(lái)響應(yīng),二是告訴瀏覽器字符編碼采用utf-8,避免亂碼众辨。
[圖片上傳中...(響應(yīng)修改編碼.png-1d11fb-1512915328362-0)]
響應(yīng)修改編碼.png
響應(yīng)內(nèi)容.png
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]
if(!port){
console.log('請(qǐng)指定端口號(hào)好不啦端三?\nnode server.js 8888 這樣不會(huì)嗎?')
process.exit(1)
}
var server = http.createServer(function(request, response){
var parsedUrl = url.parse(request.url, true)
var path = request.url
var query = ''
if(path.indexOf('?') >= 0){ query = path.substring(path.indexOf('?')) }
var pathNoQuery = parsedUrl.pathname
var queryObject = parsedUrl.query
var method = request.method
/******** 從這里開(kāi)始看鹃彻,上面不要看 ************/
console.log('方方說(shuō):得到 HTTP 路徑\n' + path)
if (path == '/style'){
response.setHeader('Content-Type', 'text/css;charset=utf-8')
response.write('body{backgroun-color: #ddd;}h1{color: red;}')
response.end()
}else if(path == '/script'){
response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
response.write('alert("這是js執(zhí)行的")')
response.end()
}else if(path == '/index'){
response.setHeader('Content-Type', 'text/html;charset=utf-8')
response.write('<!DOCTYPE>\n<html>' +
'<head><link rel="stylesheet" href="/style"></head>' +
'<body>' +
'<h1>你好郊闯,Node.js</h1>' +
'<script src="/script"></script>' +
'</body></html>')
response.end()
}else{
response.statusCode = 404
response.end()
}
/******** 代碼結(jié)束,下面不要看 ************/
})
server.listen(port)
console.log('監(jiān)聽(tīng) ' + port + ' 成功\n請(qǐng)用在空中轉(zhuǎn)體720度然后用電飯煲打開(kāi) http://localhost:' + port)
再次強(qiáng)調(diào) 再次強(qiáng)調(diào)蛛株,后綴是廢話团赁。文件內(nèi)容是有 HTTP 頭中的 Content-Type 保證的
HTTP 路徑不是文件路徑!=髀摹欢摄!/xxx.html 不一定對(duì)應(yīng) xxx.html 文件
HTTP 路徑不是文件路徑!K袼凇怀挠!/xxx.html 不一定對(duì)應(yīng) xxx.html 文件
HTTP 路徑不是文件路徑!4V印唆香!/xxx.html 不一定對(duì)應(yīng) xxx.html 文件
-
你請(qǐng)求的時(shí)候,查詢的內(nèi)容是吨艇?后面的內(nèi)容
查詢的參數(shù)從問(wèn)好開(kāi)始.png
當(dāng)你在地址欄輸入一個(gè)網(wǎng)頁(yè)的時(shí)候發(fā)生了什么呢躬它?
你輸入完之后,缺http,瀏覽器幫你加上东涡,缺路徑冯吓,幫你加上/,缺端口疮跑,幫你加上80组贺。
QQ圖片20171210222219.png