網(wǎng)絡(luò)中的術(shù)語解釋
名稱 | 解釋 | 那一層 | 說明 |
---|---|---|---|
端口號(hào) | 程序地址 | 傳輸層 | 區(qū)分同一計(jì)算機(jī)中不同的程序 |
IP地址 | 主機(jī)地址 | 網(wǎng)絡(luò)層 | 識(shí)別不同的主機(jī)或者路由器 |
MAC地址 | 物理地址 | 數(shù)據(jù)鏈路層 | 在同一數(shù)據(jù)鏈路中識(shí)別不同的計(jì)算機(jī) |
TCP | 基于字節(jié)流協(xié)議 | 傳輸層 | 面向連接,可靠的基于字節(jié)流,有順序的協(xié)議 |
UDP | 基于數(shù)據(jù)報(bào)協(xié)議 | 傳輸層 | 面向非連接,不可靠的基于數(shù)據(jù)報(bào)的,無順序的協(xié)議 |
HTTP | 基于TCP的協(xié)議 | 應(yīng)用層 | 超文本傳輸協(xié)議,基于TCP,需要建立連接 |
TCP和UDP的區(qū)別
是否連接:
TCP面向連接(發(fā)送數(shù)據(jù)之前需要建立連接,三次握手).UDP面向無連接的(發(fā)送數(shù)據(jù)無需先建立連接)
是否丟包重試
TCP實(shí)現(xiàn)了數(shù)據(jù)傳輸時(shí)的各種控制功能,可以進(jìn)行丟包的重發(fā)機(jī)制,還可以對(duì)次序亂掉的分包進(jìn)行順序控制.
因此TCP傳輸?shù)臄?shù)據(jù)是可靠的.UDP不會(huì)進(jìn)行丟包重試,也不會(huì)糾正到達(dá)的順序,甚至發(fā)送之后,根本不關(guān)心對(duì)象有沒有收到.它是不可靠的,不安全的.
傳輸模式
TCP采用的是流模式(面向字節(jié)流) UDP采用的是數(shù)據(jù)報(bào)模式(面向的是報(bào)文)
傳輸時(shí)兩端的對(duì)應(yīng)關(guān)系
TCP是一對(duì)一的關(guān)系,而UDP傳輸支持一對(duì)一,一對(duì)多,多對(duì)一,多對(duì)多的交互
可靠性
TCP全雙工非匙缬蓿可靠,無差錯(cuò),不丟失,且按序到達(dá). UDP不保證可靠性,不保證順序到達(dá).
傳輸速度
TCP較慢,UDP叫較快
應(yīng)用場(chǎng)合
TCP適用于對(duì)效率要求不高,但是對(duì)準(zhǔn)確性要求相對(duì)高.或者是要求有連接的狀況.
UDP適用于對(duì)效率要求較高,對(duì)準(zhǔn)確性要求相對(duì)較低的場(chǎng)景.
應(yīng)用示例
TCP一般應(yīng)用于文件傳輸(HTTP,FTP,對(duì)數(shù)據(jù)的準(zhǔn)確性要求較高,速度可以相對(duì)較慢)
發(fā)送和接收郵件(pop imap SMTP),遠(yuǎn)程登錄(telnet SSH 對(duì)數(shù)據(jù)準(zhǔn)確性有一定要求,有連接概念)
UDP一般應(yīng)用于即時(shí)通信(QQ聊天) 在線視頻,網(wǎng)絡(luò)語音電話
面向連接和非面向連接的形象舉例
面向連接的舉例: 兩個(gè)人打電話,首先是撥號(hào)對(duì)面應(yīng)答之后才可以通信.
面向非連接的舉例: 發(fā)送短信,只管發(fā)送,對(duì)面接收沒有接收到,并不知道.
OSI七層模型
這里我們只對(duì)OSI各層進(jìn)行功能上的大概闡述悯辙,不詳細(xì)深究搂誉,因?yàn)槊恳粚訉?shí)際都是一個(gè)復(fù)雜的層梯找。后面我也會(huì)根據(jù)個(gè)人方向展開部分層的深入學(xué)習(xí)礁苗。這里我們就大概了解一下塞祈。我們從最頂層——應(yīng)用層 開始介紹辖试。整個(gè)過程以公司A和公司B的一次商業(yè)報(bào)價(jià)單發(fā)送為例子進(jìn)行講解。
應(yīng)用層
OSI參考模型中最靠近用戶的一層惫企,是為計(jì)算機(jī)用戶提供應(yīng)用接口撕瞧,也為用戶直接提供各種網(wǎng)絡(luò)服務(wù)。我們常見應(yīng)用層的網(wǎng)絡(luò)服務(wù)協(xié)議有:HTTP狞尔,HTTPS丛版,F(xiàn)TP,POP3偏序、SMTP
實(shí)際公司A的老板就是我們所述的用戶页畦,而他要發(fā)送的商業(yè)報(bào)價(jià)單,就是應(yīng)用層提供的一種網(wǎng)絡(luò)服務(wù)研儒,當(dāng)然豫缨,老板也可以選擇其他服務(wù),比如說端朵,發(fā)一份商業(yè)合同州胳,發(fā)一份詢價(jià)單,等等逸月。
表示
表示層提供各種用于應(yīng)用層數(shù)據(jù)的編碼和轉(zhuǎn)換功能,確保一個(gè)系統(tǒng)的應(yīng)用層發(fā)送的數(shù)據(jù)能被另一個(gè)系統(tǒng)的應(yīng)用層識(shí)別。如果必要遍膜,該層可提供一種標(biāo)準(zhǔn)表示形式碗硬,用于將計(jì)算機(jī)內(nèi)部的多種數(shù)據(jù)格式轉(zhuǎn)換成通信中采用的標(biāo)準(zhǔn)表示形式。數(shù)據(jù)壓縮和加密也是表示層可提供的轉(zhuǎn)換功能
由于公司A和公司B是不同國(guó)家的公司瓢颅,他們之間的商定統(tǒng)一用英語作為交流的語言恩尾,所以此時(shí)表示層(公司的文秘),就是將應(yīng)用層的傳遞信息轉(zhuǎn)翻譯成英語挽懦。同時(shí)為了防止別的公司看到翰意,公司A的人也會(huì)對(duì)這份報(bào)價(jià)單做一些加密的處理。這就是表示的作用信柿,將應(yīng)用層的數(shù)據(jù)轉(zhuǎn)換翻譯等冀偶。
會(huì)話
會(huì)話層就是負(fù)責(zé)建立、管理和終止表示層實(shí)體之間的通信會(huì)話渔嚷。該層的通信由不同設(shè)備中的應(yīng)用程序之間的服務(wù)請(qǐng)求和響應(yīng)
會(huì)話層的同事拿到表示層的同事轉(zhuǎn)換后資料进鸠,(會(huì)話層的同事類似公司的外聯(lián)部),會(huì)話層的同事那里可能會(huì)掌握本公司與其他好多公司的聯(lián)系方式形病,這里公司就是實(shí)際傳遞過程中的實(shí)體客年。他們要管理本公司與外界好多公司的聯(lián)系會(huì)話霞幅。當(dāng)接收到表示層的數(shù)據(jù)后,會(huì)話層將會(huì)建立并記錄本次會(huì)話量瓜,他首先要找到公司B的地址信息司恳,然后將整份資料放進(jìn)信封,并寫上地址和聯(lián)系方式绍傲。準(zhǔn)備將資料寄出扔傅。等到確定公司B接收到此份報(bào)價(jià)單后,此次會(huì)話就算結(jié)束了唧取,外聯(lián)部的同事就會(huì)終止此次會(huì)話铅鲤。
傳輸
傳輸層建立了主機(jī)端到端的鏈接,傳輸層的作用是為上層協(xié)議提供端到端的可靠和透明的數(shù)據(jù)傳輸服務(wù)枫弟,包括處理差錯(cuò)控制和流量控制等問題邢享。該層向高層屏蔽了下層數(shù)據(jù)通信的細(xì)節(jié),使高層用戶看到的只是在兩個(gè)傳輸實(shí)體間的一條主機(jī)到主機(jī)的淡诗、可由用戶控制和設(shè)定的骇塘、可靠的數(shù)據(jù)通路。我們通常說的韩容,TCP UDP就是在這一層款违。端口號(hào)既是這里的“傳輸層就相當(dāng)于公司中的負(fù)責(zé)快遞郵件收發(fā)的人,公司自己的投遞員群凶,他們負(fù)責(zé)將上一層的要寄出的資料投遞到快遞公司或郵局插爹。
網(wǎng)絡(luò)
本層通過IP尋址來建立兩個(gè)節(jié)點(diǎn)之間的連接,為源端的運(yùn)輸層送來的分組请梢,選擇合適的路由和交換節(jié)點(diǎn)赠尾,正確無誤地按照地址傳送給目的端的運(yùn)輸層。就是通常說的IP層毅弧。這一層就是我們經(jīng)常說的IP協(xié)議層气嫁。IP協(xié)議是Internet的
網(wǎng)絡(luò)層就相當(dāng)于快遞公司龐大的快遞網(wǎng)絡(luò),全國(guó)不同的集散中心够坐,比如說寸宵,從深圳發(fā)往北京的順豐快遞(陸運(yùn)為例啊,空運(yùn)好像直接就飛到北京了)元咙,首先要到順豐的深圳集散中心梯影,從深圳集散中心再送到武漢集散中心,從武漢集散中心再寄到北京順義集散中心庶香。這個(gè)每個(gè)集散中心光酣,就相當(dāng)于網(wǎng)絡(luò)中的一個(gè)IP節(jié)點(diǎn)。
數(shù)據(jù)鏈路
將比特組合成字節(jié),再將字節(jié)組合成幀,使用鏈路層地址 (以太網(wǎng)使用MAC地址)來訪問介質(zhì),并進(jìn)行差錯(cuò)
數(shù)據(jù)鏈路層又分為2個(gè)子層:邏輯鏈路控制子層(LLC)和媒體訪問控制子層(MAC子層處理CSMA/CD算法脉课、數(shù)據(jù)出錯(cuò)校驗(yàn)救军、成幀等财异;LLC子層定義了一些字段使上次協(xié)議能共享數(shù)據(jù)鏈路層。 在實(shí)際使用中唱遭,LLC子層并非必需的戳寸。
物理層
實(shí)際最終信號(hào)的傳輸是通過物理層實(shí)現(xiàn)的。通過物理介質(zhì)傳輸比特流拷泽。規(guī)定了電平疫鹊、速度和電纜針腳。常用設(shè)備有(各種物理設(shè)備)集線器司致、中繼器拆吆、調(diào)制解調(diào)器、網(wǎng)線脂矫、雙絞線枣耀、同軸電纜。這些都是物理層的傳輸快遞寄送過程中的交通工具庭再,就相當(dāng)于我們的物理層捞奕,例如汽車,火車拄轻,飛機(jī)颅围,船。
TCP/IP 五層模型
網(wǎng)絡(luò)編程開始之 網(wǎng)絡(luò)基礎(chǔ)
問題1? 網(wǎng)絡(luò)上一個(gè)程序如何精準(zhǔn)的找到另一個(gè)程序?
首先程序必須先啟動(dòng),其次必須要有這臺(tái)機(jī)器的地址恨搓,以及要連接的應(yīng)用程序的主機(jī)的地址.而在計(jì)算機(jī)的應(yīng)用程序中我們可以通過ip地址來標(biāo)識(shí)臺(tái)主機(jī)的地址院促,而如何確定是哪一個(gè)應(yīng)用程序呢?這個(gè)時(shí)候就要引入一個(gè)端口號(hào)的概念斧抱,所謂端口號(hào)常拓,就是用于區(qū)分一臺(tái)計(jì)算機(jī)中不同應(yīng)用程序的標(biāo)識(shí)。
IP地址是指互聯(lián)網(wǎng)協(xié)議地址(英語:Internet Protocol Address夺姑,又譯為網(wǎng)際協(xié)議地址),
是IP Address的縮寫掌猛。IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式盏浙,
它為互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)絡(luò)和每一臺(tái)主機(jī)分配一個(gè)邏輯地址,以此來屏蔽物理地址的差異荔茬。
IP地址是一個(gè)32位的二進(jìn)制數(shù)废膘,通常被分割為4個(gè)“8位二進(jìn)制數(shù)”(也就是4個(gè)字節(jié))。
IP地址通常用“點(diǎn)分十進(jìn)制”表示成(a.b.c.d)的形式慕蔚,其中丐黄,a,b,c,d都是0~255之間的十進(jìn)制整數(shù)。
例:點(diǎn)分十進(jìn)IP地址(100.4.5.6)孔飒,實(shí)際上是32位二進(jìn)制數(shù)(01100100.00000100.00000101.00000110)灌闺。
總結(jié):
通過IP地址我們可以找到通信的是哪一個(gè)主機(jī)艰争,而通過端口號(hào),我們可以找到具體的主機(jī)上的是哪一個(gè)應(yīng)用程序桂对。網(wǎng)絡(luò)中標(biāo)識(shí)一個(gè)進(jìn)程的方式:IP + 傳輸層協(xié)議 + 端口號(hào)
問題2? 什么是socket?
socket層
描述
socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層甩卓,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層蕉斜,它是一組接口逾柿。在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門面模式宅此,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面机错,對(duì)用戶來說,一組簡(jiǎn)單的接口就是全部父腕,讓Socket去組織數(shù)據(jù)弱匪,以符合指定的協(xié)議。
其實(shí)站在你的角度上看侣诵,socket就是一個(gè)模塊痢法。我們通過調(diào)用模塊中已經(jīng)實(shí)現(xiàn)的方法建立兩個(gè)進(jìn)程之間的連接和通信。
也有人將socket說成ip+port杜顺,因?yàn)閕p是用來標(biāo)識(shí)互聯(lián)網(wǎng)中的一臺(tái)主機(jī)的位置财搁,而port是用來標(biāo)識(shí)這臺(tái)機(jī)器上的一個(gè)應(yīng)用程序。所以我們只要確立了ip和port就能找到一個(gè)應(yīng)用程序躬络,并且使用socket模塊來與之通信尖奔。
TCP/UDP
TCP(Transmission Control Protocol 傳輸控制協(xié)議) 可靠的,面向連接的協(xié)議(eg:打電話),傳輸效率低但是是全雙工一對(duì)一的,面向字節(jié)流的協(xié)議.使用TCP的應(yīng)用:Web瀏覽器,電子郵件,文件傳輸程序.
UDP(User Datagram Protocal 用戶數(shù)據(jù)報(bào)協(xié)議)不可靠的,非面向連接的協(xié)議,傳輸效率高,可以一對(duì)一,一對(duì)多,多對(duì)一,多對(duì)多,面向報(bào)文的協(xié)議.使用UDP的應(yīng)用:域名系統(tǒng)(DNS),視頻流,IP語音
TCP/UDP的編程流程
套接字(socket的使用)
基于TCP協(xié)議的socket
server端
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/22 10:34'
import socket
# 1.創(chuàng)建套接字,默認(rèn)是TCP
sk = socket.socket()
# 解決端口一直被占用的情況
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 2.綁定地址
sk.bind(("127.0.0.1",9999))
# 3.設(shè)置監(jiān)聽
sk.listen()
# 4.等待連接
conn,addr = sk.accept()
# 5.連接成功,接收數(shù)據(jù)
ret = conn.recv(4096)
print(ret) # 帶你
# 6.發(fā)送數(shù)據(jù)
conn.send(b'Receive Successful!')
# 7關(guān)閉套接字連接
conn.close() # 關(guān)閉和客戶端之間連接的套接字
sk.close() # 關(guān)閉服務(wù)器套接字
客戶端
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/22 10:39'
import socket
# 創(chuàng)建套接字
sk = socket.socket()
# 建立連接
sk.connect(("127.0.0.1", 9999))
# 發(fā)送數(shù)據(jù)
sk.send(b'123')
# 接收響應(yīng)數(shù)據(jù)
ret = sk.recv(4096)
print(ret)
# 關(guān)閉連接
sk.close()
基于UDP的socket
服務(wù)端
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/22 10:45'
import socket
# 1.創(chuàng)建一個(gè)UDP服務(wù)器的套接字,默認(rèn)是TCP的,所以要傳遞參數(shù)type
sk = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
# 2.綁定地址
sk.bind(("127.0.0.1", 8888))
# 3.接收消息
msg, addr = sk.recvfrom(4096)
# 4.發(fā)送消息
sk.sendto(b'123', addr)
# 5.關(guān)閉服務(wù)器套接字
sk.close()
客戶端
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/22 10:52'
import socket
# 1.創(chuàng)建socket
sk = socket.socket(type=socket.SOCK_DGRAM)
# 2.發(fā)送數(shù)據(jù)
sk.sendto(b'hello', ('127.0.0.1', 8888))
# 3.接收響應(yīng)數(shù)據(jù)
msg, addr = ret = sk.recvfrom(1024)
print(msg.decode('utf-8'), addr)
# 4.關(guān)閉連接
sk.close()
TCP協(xié)議的粘包
粘包是什么
TCP粘包產(chǎn)生的原因大體上可以分為兩方面:
發(fā)送端:
發(fā)送端要等待緩沖區(qū)滿才發(fā)送出去,造成粘包
接收
接收方不及時(shí)接收緩沖區(qū)的包,造成多個(gè)包接收.
TCP粘包主要從以下幾個(gè)方面去分析:
1. 發(fā)送端: TCP連接是面向流的,使用了Nagle算法進(jìn)行數(shù)據(jù)的發(fā)送優(yōu)化
2. 接收端:TCP接收端,接收端的從緩沖區(qū)取出數(shù)據(jù),取出的數(shù)據(jù)可以是發(fā)送端的多個(gè)包的組合.
TCP發(fā)送端的Nagle算法
TCP是面向連接的,所以TCP的socket編程,需要收發(fā)兩端(客戶端和服務(wù)器)都要有成對(duì)的socket,因此發(fā)送端
為了將多個(gè)發(fā)送接收端的包,更有效的發(fā)送給對(duì)方,使用了優(yōu)化算法(Nagle算法),將多次間隔較小,數(shù)量較小的數(shù)據(jù),合并成一個(gè)大的數(shù)據(jù)段,進(jìn)行封包,這樣接收端就不難于分辨出來了.因?yàn)槭橇魇降淖止?jié)流數(shù)據(jù),沒有消息邊界.
這是發(fā)送端所產(chǎn)生的粘包.
保護(hù)消息邊界和流
- 什么是保護(hù)消息邊界?
保護(hù)消息邊界,就是指?jìng)鬏攨f(xié)議把數(shù)據(jù)當(dāng)做一條獨(dú)立的消息在網(wǎng)上傳輸,接收端只能接收獨(dú)立的消息.也就是說存在保護(hù)消息邊界,接收端一次只能接收發(fā)送端的發(fā)出的一個(gè)數(shù)據(jù)包.而TCP是面向流的傳輸,所以是沒有保護(hù)消息邊界的,如果發(fā)送端連續(xù)發(fā)送數(shù)據(jù),接收端可能在一次接收中,接收了多個(gè)數(shù)據(jù)包,這樣就可以能因?yàn)閰^(qū)分不了數(shù)據(jù)包的邊界,而造成粘包.
而UDP之所以不會(huì)產(chǎn)生粘包,就是因?yàn)閁DP是面向數(shù)據(jù)包傳輸?shù)?它是由消息邊界的.UDP的每一個(gè)消息都是獨(dú)立的.UDP,由于是面向消息傳輸,它把所有接收到的消息都掛接到緩沖區(qū)的接收隊(duì)列中,因此,它對(duì)于數(shù)據(jù)的提取分離更加的方便.UDP的發(fā)送和接收保證了,只要發(fā)送一次就會(huì)接收一次的原理,即使將多個(gè)包發(fā)送到緩存區(qū),在接收區(qū),也不會(huì)一次取出來,也是要經(jīng)過相應(yīng)次數(shù)的接收才能將數(shù)據(jù)取出來.
總結(jié):粘包出現(xiàn)的原因
簡(jiǎn)單得說,在流傳輸中出現(xiàn)穷当,UDP不會(huì)出現(xiàn)粘包提茁,因?yàn)樗邢⑦吔?參考Windows網(wǎng)絡(luò)編程)
1發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包
2接收方不及時(shí)接收緩沖區(qū)的包馁菜,造成多個(gè)包接收
具體點(diǎn):
(1)發(fā)送方引起的粘包是由TCP協(xié)議本身造成的茴扁,TCP為提高傳輸效率,發(fā)送方往往要收集到足夠多的數(shù)據(jù)后才發(fā)送一包數(shù)據(jù)汪疮。若連續(xù)幾次發(fā)送的數(shù)據(jù)都很少峭火,通常TCP會(huì)根據(jù)優(yōu)化算法把這些數(shù)據(jù)合成一包后一次發(fā)送出去,這樣接收方就收到了粘包數(shù)據(jù)智嚷。
(2)接收方引起的粘包是由于接收方用戶進(jìn)程不及時(shí)接收數(shù)據(jù)卖丸,從而導(dǎo)致粘包現(xiàn)象。這是因?yàn)榻邮辗较劝咽盏降臄?shù)據(jù)放在系統(tǒng)接收緩沖區(qū)盏道,用戶進(jìn)程從該緩沖區(qū)取數(shù)據(jù)稍浆,若下一包數(shù)據(jù)到達(dá)時(shí)前一包數(shù)據(jù)尚未被用戶進(jìn)程取走,則下一包數(shù)據(jù)放到系統(tǒng)接收緩沖區(qū)時(shí)就接到前一包數(shù)據(jù)之后,而用戶進(jìn)程根據(jù)預(yù)先設(shè)定的緩沖區(qū)大小從系統(tǒng)接收緩沖區(qū)取數(shù)據(jù)衅枫,這樣就一次取到了多包數(shù)據(jù)嫁艇。
粘包情況有兩種,一種是粘在一起的包都是完整的數(shù)據(jù)包为鳄,另一種情況是粘在一起的包有不完整的包裳仆。
不是所有的粘包現(xiàn)象都需要處理,若傳輸?shù)臄?shù)據(jù)為不帶結(jié)構(gòu)的連續(xù)流數(shù)據(jù)(如文件傳輸)孤钦,則不必把粘連的包分開(簡(jiǎn)稱分包)歧斟。但在實(shí)際工程應(yīng)用中,傳輸?shù)臄?shù)據(jù)一般為帶結(jié)構(gòu)的數(shù)據(jù)偏形,這時(shí)就需要做分包處理静袖。
在處理定長(zhǎng)結(jié)構(gòu)數(shù)據(jù)的粘包問題時(shí),分包算法比較簡(jiǎn)單俊扭;在處理不定長(zhǎng)結(jié)構(gòu)數(shù)據(jù)的粘包問題時(shí)队橙,分包算法就比較復(fù)雜。特別是粘在一起的包有不完整的包的粘包情況萨惑,由于一包數(shù)據(jù)內(nèi)容被分在了兩個(gè)連續(xù)的接收包中捐康,處理起來難度較大。實(shí)際工程應(yīng)用中應(yīng)盡量避免出現(xiàn)粘包現(xiàn)象庸蔼。
避免粘包的措施
- 對(duì)于發(fā)送方引起的粘包現(xiàn)象,用戶可以通過編程設(shè)置來避免,TCP提供了數(shù)據(jù)立即傳輸,而不使用優(yōu)化到緩沖區(qū)的方法push.
2)對(duì)于接受方引起的粘包,則可以通過程序優(yōu)化程序設(shè)計(jì),提高進(jìn)程接收優(yōu)先級(jí),使其及時(shí)接收數(shù)據(jù),避免產(chǎn)生粘包.
TCP無消息邊界的解決方法
1. 發(fā)送固定長(zhǎng)度的消息.比如我們發(fā)送的時(shí)候,可以規(guī)定我們消息的長(zhǎng)度,這樣接收端就知道要接收多少數(shù)據(jù)了
2.把消息的尺寸與消息一塊發(fā)送
3.使用特殊的標(biāo)識(shí)符來區(qū)分消息的間隔,注意這里這個(gè)間隔符不能出現(xiàn)在要發(fā)送的數(shù)據(jù)中.
HTTP協(xié)議詳解
問題1? HTTP和HTTPS的區(qū)別?
首先要回答這個(gè)問題,就必須知道有HTTP協(xié)議為什么還需要HTTPS協(xié)議?
超文本傳輸協(xié)議HTTP協(xié)議是用于web瀏覽器和服務(wù)器之間傳遞信息的,但是它在信息的傳遞
的過程中是明文的,不提供任何形式的數(shù)據(jù)加密.如果攻擊者攔截到了Web瀏覽器和服務(wù)器之間的報(bào)文,就可以直接讀取其中的內(nèi)容.因此,HTTP協(xié)議不適合傳輸一些敏感的信息.例如銀行卡卡號(hào),賬號(hào)密碼等支付信息.
so,為了解決HTTP明文傳送不安全的弊端,就推出了HTTPS這個(gè)協(xié)議.具體來說這個(gè)協(xié)議就是在HTTP協(xié)議的基礎(chǔ)上添加了SSL協(xié)議,這個(gè)協(xié)議可以對(duì)瀏覽器和服務(wù)器之間傳輸?shù)膱?bào)文進(jìn)行加密,以及通過證書對(duì)服務(wù)器進(jìn)行驗(yàn)證.
HTTPS: 其實(shí)就是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單的說就是HTTP的安全版.它使用安全套接字層(SSL secure sockets layer)進(jìn)行信息交換,簡(jiǎn)單的說它是HTTP的安全版.
總結(jié) HTTP和HTTPS的區(qū)別?
- HTTP是明文傳輸文本的協(xié)議,而HTTPS是通過SSL安全套接字層進(jìn)行加密之后的協(xié)議.
2.HTTPS協(xié)議需要加入ca申請(qǐng)證書,一般免費(fèi)證書很少,需要交費(fèi).
3.HTTPS比HTTP多了兩個(gè)東西,一個(gè)是SSL加密,保證數(shù)據(jù)傳輸?shù)陌踩?另一個(gè)就是信任證書,確定服務(wù)器的來源是安全的.
4.HTTPS和HTTP連接的時(shí)候使用的端口號(hào)是不一樣的,HTTPS默認(rèn)是80端口,而后者是443.
問題2?簡(jiǎn)述HTTP的一次全過程
HTTP請(qǐng)求的整個(gè)流程
上個(gè)圖先
1. 第一步DNS域名解析
通過域名解析,獲取到要連接的服務(wù)器的網(wǎng)路地址.
2. 建立TCP連接
三次握手,建立HTTP協(xié)議需要的支撐協(xié)議的TCP連接的三次握手.
3. 發(fā)起HTTP請(qǐng)求
瀏覽器發(fā)送報(bào)文,包括請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體以空行結(jié)束,向服務(wù)器發(fā)送報(bào)文.
4. 服務(wù)器收到報(bào)文,并根據(jù)請(qǐng)求的內(nèi)容作出響應(yīng).
5. 瀏覽器收到報(bào)文,根據(jù)報(bào)文的文件類型,進(jìn)行相應(yīng),解析和顯示
注意HTTP1.0版本模式是短連接的,而HTTP1.1版本加入了長(zhǎng)連接.如果瀏覽器或者服務(wù)器在其頭部加入了這行代碼:Connection:keep-alive
問題3?HTTP的長(zhǎng)連接和短連接
什么是長(zhǎng)連接和短連接?
短連接:
瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作(請(qǐng)求和響應(yīng)),就建立一次連接,任務(wù)結(jié)束就中斷連接.舉個(gè)例子,比如瀏覽器訪問一個(gè)HTML頁面,包含有其他的web資源,例如js文件,圖片,css文件等,每遇到一個(gè)web資源,就會(huì)建立一個(gè)HTTP連接.在HTTP1.0中,采用的都是短連接
長(zhǎng)連接:
從HTTP1.1中,默認(rèn)采用的是長(zhǎng)連接,通過在報(bào)文的頭部添加Connection:keep-alive來實(shí)現(xiàn).當(dāng)使用長(zhǎng)連接的時(shí)候,客戶端和服務(wù)器之間建立的TCP的連接通道不會(huì)關(guān)閉,如果瀏覽器再請(qǐng)求這個(gè)服務(wù)器上的資源,可以使用這個(gè)連接.長(zhǎng)連接也不是無限期的連接,它有一個(gè)保持時(shí)間,可以在服務(wù)器軟件中設(shè)定這個(gè)時(shí)間.
注意: HTTP的長(zhǎng)連接和短連接,實(shí)際上是TCP的長(zhǎng)短連接,并且必須瀏覽器和服務(wù)器同時(shí)都支持才可以
長(zhǎng)連接和短連接的優(yōu)缺點(diǎn)
- 長(zhǎng)連接可以減少頻繁的創(chuàng)建和關(guān)閉連接,一定程度上節(jié)約了時(shí)間,減少浪費(fèi).對(duì)于請(qǐng)求和響應(yīng)比較頻繁的操作來說,使用長(zhǎng)連接比較合適.但是長(zhǎng)連接存在一個(gè)問題,因?yàn)橐恢本S持著連接,如果服務(wù)器上連接的瀏覽器用戶較多的時(shí)候,對(duì)服務(wù)器的負(fù)載來說是各考驗(yàn).這個(gè)時(shí)候服務(wù)器就要采取一些策略,比如關(guān)閉一些長(zhǎng)時(shí)間沒有進(jìn)行操作的連接.
2.短連接對(duì)于服務(wù)器來說管理較為簡(jiǎn)單,存在的連接都是有用的連接,不需要額外的控制手段.但是如果客戶端請(qǐng)求比較頻繁,將會(huì)在TCP建立連接和關(guān)閉連接上浪費(fèi)時(shí)間和寬帶.
什么時(shí)候使用長(zhǎng)連接和短連接
長(zhǎng)連接多用于操作頻繁,點(diǎn)對(duì)點(diǎn)的通信,而且連接數(shù)不能太多的情況.
而短連接適用于那些連接不是很頻繁,但是連接人數(shù)比較多的情況.