HTTP請(qǐng)求的三次握手徘键,四次揮手
-
三次握手
- 客戶端發(fā)送一個(gè)帶有SYN(建立連接)的TCP報(bào)文到服務(wù)器,這個(gè)三次握手的開始,表示客戶端想要和服務(wù)端建立連接
- 服務(wù)端接受到客戶端的請(qǐng)求,返回客戶端報(bào)文殴穴,這個(gè)報(bào)文帶有SYN(建立連接)和ACK(確認(rèn))標(biāo)志,詢問(wèn)客戶端是否準(zhǔn)備好
- 客戶端再次響應(yīng)服務(wù)端一個(gè)ACK(確認(rèn))货葬,表示自己已經(jīng)準(zhǔn)備好
舉例說(shuō)明為什么是三次而不是兩次
???????客戶發(fā)送了第一個(gè)連接的請(qǐng)求報(bào)文,但是由于網(wǎng)絡(luò)不好劲够,這個(gè)請(qǐng)求沒(méi)有立即到達(dá)服務(wù)器震桶,而是在某個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)滯留了,直到某個(gè)時(shí)間才到達(dá)服務(wù)器征绎,本來(lái)這已經(jīng)是一個(gè)失效的鏈接報(bào)文蹲姐,但是服務(wù)器接收到這個(gè)請(qǐng)求報(bào)文后,還是會(huì)向客戶端發(fā)出確認(rèn)的報(bào)文人柿,表示同意鏈接柴墩,假如不使用第三次握手,那么只要服務(wù)端發(fā)出確認(rèn)凫岖,連接就會(huì)建立江咳,但其實(shí)這個(gè)請(qǐng)求是失效的請(qǐng)求,客戶端是不會(huì)理睬服務(wù)器發(fā)來(lái)的確認(rèn)信息哥放,也不會(huì)向服務(wù)器發(fā)送確認(rèn)請(qǐng)求歼指,但是服務(wù)器認(rèn)為新的連接已經(jīng)建立起來(lái)了,并一直等待客戶端發(fā)送數(shù)據(jù)甥雕,這樣踩身,服務(wù)器的很多資源就會(huì)白白浪費(fèi)。采用三次握手就是為了防止這種情況的發(fā)生社露,服務(wù)器會(huì)因?yàn)榻邮詹坏酱_認(rèn)的報(bào)文挟阻,就知道客戶端沒(méi)有建立連接。
- 四次揮手
- 客戶端發(fā)送一個(gè)FIN峭弟,用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送附鸽。
- 服務(wù)器接收到FIN,它發(fā)回一個(gè)ACK孟害,確認(rèn)序號(hào)為收到的序號(hào)+1拒炎。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)挨务。
- 服務(wù)器關(guān)閉客戶端的鏈接击你,發(fā)送一個(gè)FIN給客戶端玉组。
- 客戶端發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到的序號(hào)+1丁侄。
重定this指向惯雳,call,apply鸿摇,bind
例1
var name = "小王",age = 17;
var obj = {
name:"小張";
obAge:this.age;
myFun:function(){
console.log(this.name + "年齡" + this.age);
}
}
obj.objAge; //17
obj.myFun() //小張年齡undefined
例2
var fav = "盲僧";
function shows(){
console.log(this.fav);
}
shows() //盲僧
比較一下這兩者this 的差別石景,第一個(gè)this 指向obj,第二個(gè)全局聲明的shows()函數(shù) this 是window 拙吉;
1潮孽,call()、apply()筷黔、bind() 都是用來(lái)重定義 this 這個(gè)對(duì)象的往史!
如:
obj.myFun.call(db); //德瑪年齡99
obj.myFun.apply(db); //德瑪年齡99
obj.myFun.bind(db)(); //德瑪年齡99
以上出了bind 方法后面多了個(gè)()外 ,結(jié)果返回都一致佛舱!
由此得出結(jié)論椎例,bing 返回的是一個(gè)新的函數(shù),你必須調(diào)用它才會(huì)被執(zhí)行
2请祖,對(duì)比call 订歪、bind 、 apply 傳參情況下
obj.myFun.call(db,'成都','上海'); //德瑪 年齡 99 來(lái)自 成都 去往 上海
obj.myFun.apply(db,['成都','上海']); //德瑪 年齡99 來(lái)自 成都去往 上海
obj.myFun.bind(db,'成都','上海')(); //德瑪 年齡 99 來(lái)自 成都去往上海
obj.myFun.bind(db,['成都','上海'])(); //德瑪 年齡 99 來(lái)自 成都,上海去往undefined
從上面四個(gè)結(jié)果不難看出
call 肆捕、bind 刷晋、 apply 這三個(gè)函數(shù)的第一個(gè)參數(shù)都是 this 的指向?qū)ο螅?br> 第二個(gè)參數(shù)差別就來(lái)了:
call的參數(shù)是直接放進(jìn)去的,第二第三第n個(gè)參數(shù)全都用逗號(hào)分隔福压,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )掏秩;
apply的所有參數(shù)都必須放在一個(gè)數(shù)組里面?zhèn)鬟M(jìn)去 obj.myFun.apply(db,['成都', ..., 'string' ]);
bind除了返回是函數(shù)以外,它 的參數(shù)和call 一樣荆姆。
當(dāng)然蒙幻,三者的參數(shù)不限定是string類型,允許是各種類型胆筒,包括函數(shù) 邮破、 object 等等!