大學(xué)教科書中有說分成7層,也有說分成4層的咽块,筆者覺得4層更合適一些,像七層中的第5腻惠、6層完全不是必須的环肘,就算有也是各自制定協(xié)議,而制定協(xié)議的人基本不會(huì)去考慮第5層叫會(huì)話層第6層叫表示層妖枚,在私有應(yīng)用層協(xié)議中廷臼,更多的是會(huì)私定一個(gè)握手互信協(xié)議,以表示通訊雙方是互信的.
TCP/ IP 協(xié)議,是一組協(xié)議簇.而不是兩種協(xié)議,其范圍以其分層模型來進(jìn)行分類
- 應(yīng)用層:
程序員所編寫好的網(wǎng)絡(luò)程序,就是應(yīng)用層.qq,微信,瀏覽器等等.基于網(wǎng)絡(luò)編程的,都屬于應(yīng)用層的范濤.
應(yīng)用層協(xié)議:
常見與常用的 http協(xié)議,ftp協(xié)議,telnet,smpp,xmpp等共有協(xié)議. 還有諸如六毛的私有協(xié)議.
- 傳輸層
什么是傳輸層,傳輸層是干嘛的,傳輸層,是用來做數(shù)據(jù)傳輸?shù)?數(shù)據(jù)是什么,數(shù)據(jù)就是我們?cè)谑褂脩?yīng)用層網(wǎng)絡(luò)程序時(shí)產(chǎn)生的一系列數(shù)據(jù),這些數(shù)據(jù)需要在網(wǎng)絡(luò)上流動(dòng),傳輸,才能實(shí)現(xiàn)數(shù)據(jù)在通過網(wǎng)絡(luò)在各客戶端程序之間的交互與傳輸.怎么傳輸這些數(shù)據(jù),就需要使用到傳輸層的傳輸協(xié)議:TCP/UDP協(xié)議.傳輸層就只有這兩種公有標(biāo)準(zhǔn)傳輸協(xié)議
tcp/udp 協(xié)議不僅指定了數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn),同時(shí)也代表著兩種截然不同的數(shù)據(jù)傳輸方式.應(yīng)用與不同的數(shù)據(jù)傳輸場景與需求.他們各自有各自的優(yōu)點(diǎn)與針對(duì)點(diǎn),也各有不足.我們?cè)谶x擇何種傳輸協(xié)議的時(shí)候.需要按數(shù)據(jù)傳輸?shù)念愋秃托枨髞磉x擇合適的傳輸協(xié)議.
tcp協(xié)議的主要實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信,需要知道彼此都在家呆著,(通過四次握手建立連接)數(shù)據(jù)發(fā)送需要進(jìn)行確認(rèn).是數(shù)據(jù)安全的.由客戶端發(fā)起連接,向服務(wù)端請(qǐng)求數(shù)據(jù).
UDP協(xié)議,客戶端知道服務(wù)器的家在哪,而不需要卻定其是否在家.直接發(fā)送數(shù)據(jù)包過去.如果服務(wù)器不在.則信息丟失.數(shù)據(jù)的傳輸不可靠,不安全.具有一定的風(fēng)險(xiǎn)性.
應(yīng)用層在將數(shù)據(jù)傳輸給傳輸層后,傳輸成為數(shù)據(jù)貼上相關(guān)信息,發(fā)往指定的地址.
傳輸層傳輸?shù)臄?shù)據(jù),是應(yīng)用層數(shù)據(jù)進(jìn)行一次包裝后的整體數(shù)據(jù)包.(就相當(dāng)于一個(gè)快遞包裹).傳輸層協(xié)議貼上的標(biāo)記信息,就是頭部數(shù)據(jù).
- 網(wǎng)絡(luò)層
ip,icmparp,rarp協(xié)議等.
對(duì)于普通編程人員來說,做需要關(guān)注,與最容易涉及到的,無疑就是應(yīng)用層,與傳輸層.我們?cè)诰帉懢W(wǎng)絡(luò)程序的時(shí)候,一定會(huì)有各種不同場景下的數(shù)據(jù)交互需求,因此,應(yīng)用層協(xié)議與傳輸層協(xié)議是我們必須得詳細(xì)的學(xué)習(xí)和運(yùn)用的.
應(yīng)用層與傳輸層之間的關(guān)系也是十分緊密.
- 以http協(xié)議來說:
http協(xié)議是一個(gè)簡單的請(qǐng)求-響應(yīng)協(xié)議.我們最常使用的通過瀏覽器瀏覽網(wǎng)站,網(wǎng)頁.大多都是基于這類協(xié)議的(http,https,總之一定是請(qǐng)求-響應(yīng)協(xié)議).
http協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用層協(xié)議.我們?cè)谠L問一個(gè)網(wǎng)站的時(shí)候.瀏覽器會(huì)通過TCP協(xié)議發(fā)送如下字符串到服務(wù)器的應(yīng)用層:
GET /test/abtest HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: PHPSESSID=970260278652571648
我們隨意訪問一個(gè)網(wǎng)站,進(jìn)入開發(fā)模式,即可查看到相關(guān)的消息頭與參數(shù).這些字符串就是應(yīng)用層數(shù)據(jù),應(yīng)用層數(shù)據(jù)是按照一定格式來組織的.這個(gè)格式就是應(yīng)用協(xié)議.譬如http協(xié)議.
傳輸層在往應(yīng)用層傳遞數(shù)據(jù)的時(shí)候,并不保證每次傳遞的數(shù)據(jù)都是一個(gè)完整的應(yīng)用層數(shù)據(jù)包.(以http協(xié)議為例,并不能保證應(yīng)用層收到的一定是一個(gè)完整的http數(shù)據(jù)包)這就是半包與粘包,傳輸層只負(fù)責(zé)傳遞buye[]數(shù)據(jù),應(yīng)用層需要自己對(duì)byte[]數(shù)據(jù)進(jìn)行解碼.
2020.1.19