HTTP與TCP 協(xié)議
HTTP 協(xié)議的底層其實(shí)是由 TCP 協(xié)議和 IP 協(xié)議(簡(jiǎn)稱 TCP/IP)構(gòu)建的。關(guān)于TCP 協(xié)議(傳輸控制協(xié)議)桑孩,有兩個(gè)相關(guān)知識(shí)點(diǎn)需要了解:
- tcp與udp的區(qū)別
[博客]https://www.nowcoder.com/questionTerminal/63c8b45c91a544bd8febc1f1ff02e3b5?toCommentId=73766
答:tcp可靠(可靠指的是了解是誰(shuí)收到客戶端請(qǐng)求)麦乞、面向連接蚂夕,相對(duì)udp較慢锹漱;udp不可靠,不面向連接奥喻、相對(duì)tcp較快偶宫。
2.tcp的三次握手指的是什么 [博客]https://github.com/jawil/blog/issues/14
答:每次建立連接前,客戶端和服務(wù)端之前都要進(jìn)行三次對(duì)話才開始正式傳輸內(nèi)容:
- 客戶端:我要連接你了环鲤,可以嗎
- 服務(wù)端:嗯纯趋,我準(zhǔn)備好了,連接我吧
- 客戶端:那我連接你咯楔绞。
- (開始后面步驟)
IP
IP包括內(nèi)網(wǎng) IP 和外網(wǎng) IP结闸,除此之外,還有兩個(gè)特別特殊的 IP酒朵,就是本地 IP:127.0.0.1桦锄。本地 IP 永遠(yuǎn)表示設(shè)備自己。
還有一個(gè)特別特殊的 IP:0.0.0.0蔫耽,它不表示任何設(shè)備结耀。這個(gè) IP 不同的地方含義不同,以后我們會(huì)用到匙铡,用到的時(shí)候再說意思图甜。
端口
你想要訪問一個(gè)設(shè)備(前提是你使用的是 TCP 或 UDP 協(xié)議。還記得嗎鳖眼,HTTP 就使用了 TCP)黑毅,只指定 IP 是不夠的,還必須指定端口(Port)钦讳。
端口其實(shí)就是一個(gè)編號(hào)矿瘦,并不是一種硬件。
一個(gè)服務(wù)器(硬件)不一定只提供一種服務(wù)愿卒,比如一個(gè)服務(wù)器既提供 HTTP 服務(wù)缚去,又提供 FTP 服務(wù),還提供 SMTP 服務(wù)(郵件服務(wù))琼开,那么只用一個(gè) IP 是無法告訴服務(wù)器你想要使用哪種服務(wù)易结。
所以這里有一個(gè)重要的原則:一個(gè)端口對(duì)應(yīng)一個(gè)服務(wù)。
使用node.js寫服務(wù)器
使用node.js,可以完成一個(gè)服務(wù)器的demo來理解客戶端(這里就是瀏覽器啦~)和服務(wù)器的交互(發(fā)送請(qǐng)求和響應(yīng))
代碼的連接在這里:[node.js服務(wù)器]搞动。躏精。。滋尉。玉控。飞主。
在終端上執(zhí)行代碼就啟動(dòng)了這個(gè)服務(wù)器:
node server-1.js 8888
- 客戶端發(fā)送請(qǐng)求:
在瀏覽器里輸入服務(wù)器地址 localhost:8080/index?name=yss狮惜,服務(wù)器收到請(qǐng)求后會(huì)根據(jù)server-1.js中下面的代碼給出反饋:
console.log('ss說:得到http路徑\n' + path)
console.log('ss說:查詢字符串的路徑\n' + query)
console.log('ss說:含查詢字符串的路徑\n' + pathWithQuery)
2.服務(wù)器的反饋
下面這段代碼,服務(wù)器會(huì)根據(jù).setheader里的content type要求碌识,來解析response.write中的內(nèi)容碾篡,最后會(huì)反饋到頁(yè)面上形成網(wǎng)頁(yè)。
if(path === '/index'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/html; charset=utf-8')
response.write('<!DOCTYPE html>\n<html>' + '<head><link rel="stylesheet" href="/style"></head>' + '<body><h1>我是html</h1>' + '<script src="/script"></script>' +'</body></html>')
response.end()
}else if(path === '/style'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/css; charset=utf-8')
response.write('body{background: red;}')
response.end()
}else if(path === '/script'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/javascript; charset=utf-8')
response.write('Alert(“我是js執(zhí)行的”)')
response.end()
}
else{
response.statusCode = 404
response.setHeader('Content-Type', 'text/html;charset=utf-8')
response.write('嗚嗚嗚')
response.end()
}