python服務(wù)器高并發(fā)編程
1.socket相關(guān)概念
注意:請別關(guān)注圖從哪里來饥伊,我只是想把知識點講清楚
- 進程與進程通信的方式
- [ ] 管道(無名象浑、高級、有名)
- [ ] 消息隊列(message queue)
- [ ] 信號量
- [ ] 信號
- [ ] 共享內(nèi)存
- [ ] 套接字
注意:本篇只討論socket通信琅豆,其他進程間的方式不去論述愉豺,羅列的原因是為了說明socket本質(zhì)就是為了解決進程間的通信問題,尤其是網(wǎng)絡(luò)上兩個進程通信的問題茫因。
- socket地址 = ip地址 + 端口號
ip地址:唯一定位一個網(wǎng)絡(luò)主機
端口號:唯一映射一個需要網(wǎng)絡(luò)服務(wù)的進程
socket地址解決了兩個進程通信時如何相互定位的問題蚪拦。具體通信時,數(shù)據(jù)怎么傳輸冻押,傳輸多少驰贷,那就是Tcp/ip協(xié)議的相關(guān)內(nèi)容了!
這里簡單的描述一下TCP和UDP
上個圖:網(wǎng)絡(luò)中翼雀,不同的層解決不同的問題饱苟,因而每一層有個頭,上層消息被包裹在下層消息體中狼渊,其中進程間通信的socket數(shù)據(jù)包被包裹在ip包中箱熬。
- [ ] 1.在鏈路層类垦,由以太網(wǎng)的物理特性決定了數(shù)據(jù)幀的長度為(46+18)-(1500+18),其中的18是數(shù)據(jù)幀的頭和尾城须,也就是說數(shù)據(jù)幀的內(nèi)容最大為1500(不包括幀頭和幀尾)蚤认,即MTU(Maximum
- [ ] Transmission Unit)為1500;
- [ ] 2.在網(wǎng)絡(luò)層糕伐,因為IP包的首部要占用20字節(jié)砰琢,所以這的MTU為1500-20=1480;
- [ ] 3.在傳輸層:每次傳輸?shù)臄?shù)據(jù)包受到IP包長度的限制良瞧,每個數(shù)據(jù)包連頭部不能超過IP報的MTU
UDP包是將所有的數(shù)據(jù)放在一個IP包中傳輸陪汽,而UDP包的首部要占用8字節(jié),所以UTP的MTU為1480-8=1472褥蚯;
TCP則先通過一定的交互建立連接挚冤,然后將數(shù)據(jù)切片發(fā)送--具體里面的協(xié)議就不講了!
Tcp數(shù)據(jù)包的圖:TCP連接一旦建立赞庶,則開始分片發(fā)送數(shù)據(jù)
- 啰嗦一下TCP三次握手训挡,四次揮手
首先上圖:
問題1:為什么要進行第三次握手
第一次握手,客戶端和服務(wù)器一發(fā)一答代表雙方活著歧强,可以發(fā)送數(shù)據(jù)澜薄。
而,客戶端再發(fā)一次應(yīng)答的原因:主要是為了防止已失效的連接請求報文段又突然傳送給B摊册,從而產(chǎn)生了錯誤肤京。
問題2:為什么要進行四次揮手
過程:
第一次揮手:主機1向主機2,發(fā)送FIN報文段丧靡,表示關(guān)閉數(shù)據(jù)傳送倒慧,并主機1進入FIN_WAIT_1狀態(tài)拿愧,表示沒有數(shù)據(jù)要傳輸了
第二次揮手:主機2收到FIN報文段后進入CLOSE_WAIT狀態(tài)(被動關(guān)閉),然后發(fā)送ACK確認,表示同意你關(guān)閉請求了奈籽,主機到主機的數(shù)據(jù)鏈路關(guān)閉烦衣,主機進入FIN_WAIT_2狀態(tài)
第三次揮手:主機2等待主機1發(fā)送完數(shù)據(jù)讥此,發(fā)送FIN到主機1請求關(guān)閉兔甘,主機2進入LAST_ACK狀態(tài)
第四次揮手:主機1收到主機2發(fā)送的FIN后,回復(fù)ACK確認到主機2卤恳,主機1進入TIME_WAIT狀態(tài)累盗。主機2收到主機1的ACK后就關(guān)閉連接了,狀態(tài)為CLOSED突琳。主機1等待2MSL若债,仍然沒有收到主機2的回復(fù),說明主機2已經(jīng)正常關(guān)閉了拆融,主機1關(guān)閉連接蠢琳。
為什么:
我告訴你的原因是為了保證TCP的穩(wěn)健性啊终,具體的情況很多,我也說不清楚傲须!
待續(xù)……