Python網(wǎng)絡(luò)編程概述

網(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)象庸蔼。

避免粘包的措施

  1. 對(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é)議詳解

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ū)別?

  1. 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)

  1. 長(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ù)比較多的情況.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末解总,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姐仅,更是在濱河造成了極大的恐慌花枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏膏,死亡現(xiàn)場(chǎng)離奇詭異劳翰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)馒疹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門佳簸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颖变,你說我怎么就攤上這事生均。” “怎么了悼做?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵疯特,是天一觀的道長(zhǎng)哗魂。 經(jīng)常有香客問我肛走,道長(zhǎng),這世上最難降的妖魔是什么录别? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任朽色,我火速辦了婚禮邻吞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葫男。我一直安慰自己抱冷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布梢褐。 她就那樣靜靜地躺著旺遮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盈咳。 梳的紋絲不亂的頭發(fā)上耿眉,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音鱼响,去河邊找鬼鸣剪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丈积,可吹牛的內(nèi)容都是我干的筐骇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼江滨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铛纬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牙寞,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤饺鹃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后间雀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悔详,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年惹挟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茄螃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡连锯,死狀恐怖归苍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情运怖,我是刑警寧澤拼弃,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站摇展,受9級(jí)特大地震影響吻氧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一盯孙、第九天 我趴在偏房一處隱蔽的房頂上張望鲁森。 院中可真熱鬧,春花似錦振惰、人聲如沸歌溉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痛垛。三九已至,卻和暖如春桶蛔,著一層夾襖步出監(jiān)牢的瞬間榜晦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工羽圃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乾胶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓朽寞,卻偏偏與公主長(zhǎng)得像识窿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脑融,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容