OSI模型
| OSI | TCP/IP | 協(xié)議 | 功能 |
|---|---|---|---|
| 應(yīng)用層 | 應(yīng)用層 | HTTP,SMTP,RTP,DNS | 為應(yīng)用程序提供服務(wù) |
| 表示 | |||
| 會(huì)話 | |||
| 傳輸 | 傳輸層 | TCP UDP | 建立,管理和維護(hù)會(huì)話 |
| 網(wǎng)絡(luò) | 網(wǎng)絡(luò)層 | IP ICMP | IP選址及路由選擇 |
| 數(shù)據(jù)鏈路 | 數(shù)據(jù)鏈路層 | DSL SONET 802.11 | 提供介質(zhì)訪問和鏈路管理 |
| 物理 | 物理層 | 物理層 |
IPv4
- 版本:記錄數(shù)據(jù)報(bào)屬于哪個(gè)協(xié)議版本
- IHL:指明頭有多長,最小為5,頭部沒有可選項(xiàng),最大為15,選項(xiàng)字段最多為40字節(jié)
- 區(qū)分服務(wù):服務(wù)類型
- 總長度:最大長度為65535
- 標(biāo)識(shí):讓目標(biāo)主機(jī)確定一個(gè)新到達(dá)的分段屬于哪一個(gè)數(shù)據(jù)報(bào)
- 未使用的位:
- DF:不分段
- MF:更多的段,除最后一個(gè)段之外其他都需要設(shè)置
- 分段偏移量:指明了該段在當(dāng)前數(shù)據(jù)報(bào)中的偏移位置
- 生存期:限制數(shù)據(jù)包生存期計(jì)數(shù)器
- 協(xié)議:
- 頭校驗(yàn):所有的16位半字加起來取補(bǔ)碼和為0
- 源地址:
- 目的地址:
- 選項(xiàng):
分層設(shè)計(jì):
- 保持較少的路由前綴
- 不適合移動(dòng)網(wǎng)絡(luò)
- 浪費(fèi)地址
- A類地址:1.0.0.0-127.255.255.255
- B類地址:128.0.0.0-191.255.255.255
- C類地址:192.0.0.0-223.255.255.255
- D類地址:224.0.0.0-239.255.255.255
- E類地址:240.0.0.0-255.255.255.255
UDP(用戶數(shù)據(jù)報(bào)協(xié)議)
TCP(傳輸控制協(xié)議)
- 字節(jié)流
- 全雙工,端到端
- 緊急數(shù)據(jù)(ugent data)處理:一個(gè)交互式用戶鍵入Ctrl+C來中斷一個(gè)已經(jīng)開始運(yùn)行的遠(yuǎn)程計(jì)算時(shí),發(fā)送端程序把一些控制信息放在數(shù)據(jù)流中,并且將它連同URGENT標(biāo)志一起交給TCP,這一事件將導(dǎo)致TCP停止積累數(shù)據(jù),并將該連接上已有的所有數(shù)據(jù)立即傳輸出去,當(dāng)接收方收到緊急數(shù)據(jù)后,接收端程序被中斷,它停止當(dāng)前正在完成的工作,并且讀入數(shù)據(jù)流以便找到緊急數(shù)據(jù),緊急數(shù)據(jù)的尾部應(yīng)該被標(biāo)記以便知道緊急數(shù)據(jù)的結(jié)束位置
- 20字節(jié)的頭部
- 最多可達(dá)數(shù)據(jù)65535-20(IP)-20(TCP)=65495
TCP報(bào)文格式
- 源端口:
- 目標(biāo)端口:
- 序號(hào)(SEQ)和確認(rèn)號(hào)(ack):
- TCP頭長度:指明TCP頭包含多少個(gè)32位的字
- 沒有被使用的4位:
- 8個(gè)1比特的標(biāo)志位:CWR,ECE(擁塞控制,設(shè)置ECE告訴放慢速率,設(shè)置CWR說明已經(jīng)放慢速率了),URG(緊急指針),ACK,PSH(推送數(shù)據(jù),不會(huì)進(jìn)入緩沖區(qū)),RST(拒接連接),SYN(建立連接過程),FIN(釋放連接)
- 窗口大?。河糜诹髁靠刂?,為0時(shí)說明發(fā)送數(shù)據(jù)太多,接收不了了
- 校驗(yàn)和:
- 緊急指針:
- 選項(xiàng):最大段長選項(xiàng),時(shí)間戳選項(xiàng)(32位序號(hào)很快被消耗完,可以用時(shí)間戳來避免序號(hào)回繞問題),選擇確認(rèn):
三次握手
- 客戶端發(fā)送SYN=1,seq=x,ACK=0的TCP段請求連接-SYN_SEND
- 服務(wù)端檢查是否有進(jìn)程監(jiān)聽端口,如果沒有則發(fā)送一個(gè)RST=1的拒絕報(bào)文,如果有,接受請求時(shí)返回確認(rèn)段syn=1,seq=y,ack=x+1,ACK=1-SYN_RECV
- 客戶端接收到確認(rèn)段,返回seq=x+1,ack=y+1,ACK=1給服務(wù)端,建立連接-ESTABLISHED
四次揮手
- 客戶端發(fā)送FIN=1,seq=u,進(jìn)入FIN_WAIT_1狀態(tài)
- 服務(wù)端接收到發(fā)送ACK=1,seq=v,ack=u+1進(jìn)入CLOSE_WAIT狀態(tài)
- 客戶端接收到之后進(jìn)入FIN_WAIT_2狀態(tài),服務(wù)端發(fā)送完成以后發(fā)送FIN=1,seq=w,ack=u+1進(jìn)入LAST_ACK狀態(tài)
- 客戶端接收回復(fù)ACK=1,seq=u+1,ack=w+1進(jìn)入TIME_WAIT狀態(tài),服務(wù)端收到以后進(jìn)入CLOSED
- 經(jīng)過2MSL客戶端關(guān)閉連接進(jìn)入CLOSED狀態(tài)
- 建立連接時(shí)可以將ACK和SYN一起發(fā)送,關(guān)閉連接時(shí),服務(wù)器端可能不會(huì)立即關(guān)閉socket,這個(gè)時(shí)候需要先告訴客戶端已經(jīng)收到消息了,因此多了一次發(fā)送
- TIME_WAIT時(shí)間為2MSL(最大報(bào)文段生存時(shí)間):如果最后一個(gè)ACK丟失,服務(wù)端沒有收到就會(huì)不斷重發(fā)FIN報(bào)文,所以需要時(shí)間確認(rèn)客戶端是否重發(fā)報(bào)文
- 三次握手完成兩個(gè)功能:確認(rèn)雙方彼此知道對方做好了發(fā)送數(shù)據(jù)的準(zhǔn)備工作,而且允許雙方進(jìn)行初始序列號(hào)協(xié)商,為了防止已經(jīng)失效的連接請求報(bào)文段突然又傳送到服務(wù)端,會(huì)讓服務(wù)端一直進(jìn)行等待。
TCP粘包問題:發(fā)送方發(fā)送的若干數(shù)據(jù)包到接收方粘成一包,TCP一次發(fā)送多個(gè)分組,TCP應(yīng)用層處理速度小于接收速度
解決方法:使用TCP_NODELAY ,文件不需要處理,讀取發(fā)送長度,格式化數(shù)據(jù)
HTTP:(應(yīng)用層協(xié)議)
HTTP1.0 請求-連接-釋放
HTTP1.1 持續(xù)連接,連接重用,流水線請求,設(shè)置保持時(shí)間
| 方法 | 描述 |
|---|---|
| get | 獲取資源,請求附在url后,傳輸容量有限制 |
| post | 傳輸實(shí)體文本,請求放置在HTTP報(bào)文實(shí)體里 |
| head | 沒有實(shí)體,獲取報(bào)文首部 |
| put | 傳輸文件 |
| delete | 刪除文件 |
| trace | 追蹤路徑 |
| connect | 要求使用隧道協(xié)議連接代理 |
| options | 詢問支持的方法 |
響應(yīng)碼
| 代碼 | 含義 | 例子 |
|---|---|---|
| 1XX | 信息 | 100=服務(wù)器同意處理客戶請求 |
| 2XX | 成功 | 200=請求成功,204=沒有內(nèi)容 |
| 3XX | 重定向 | 301=移動(dòng)頁面,304=頁面依然有效 |
| 4XX | 客戶錯(cuò)誤 | 403=禁止頁面,404=頁面沒找到 |
| 5XX | 服務(wù)器錯(cuò)誤 | 500=服務(wù)器內(nèi)部錯(cuò)誤,503=稍后再試 |
緩存 Catch-Control
- 頁面驗(yàn)證:通過緩存頁面最初獲取時(shí)返回的Expires頭以及當(dāng)前的日期和時(shí)間決定頁面是否有效,啟發(fā)式策略:如果頁面一年內(nèi)沒有更新,則該頁面在下一個(gè)小時(shí)內(nèi)也不會(huì)更新
- 詢問服務(wù)器緩存副本是否有效,條件get
- IF-modified-since Last-modified
- 請求驗(yàn)證緩存的副本
連接步驟
- 默認(rèn)情況下客戶端在端口80打開與服務(wù)器的一個(gè)TCP連接,URL可以指定其他端口
- 客戶端發(fā)送消息給服務(wù)端,請求指定路徑上的資源,包括一個(gè)首部,可選地,還可以有一個(gè)空行,后面是請求的數(shù)據(jù)
- 服務(wù)端向客戶端發(fā)送響應(yīng),響應(yīng)以響應(yīng)碼開頭,后面是包含元數(shù)據(jù)的首部,一個(gè)空行以及鎖請求的文檔或錯(cuò)誤信息
- 服務(wù)器關(guān)閉連接
Cookie
- 只能是空白符的ASCII文本,不能包含逗號(hào)或分號(hào)
- 要在瀏覽器中設(shè)置cookie,服務(wù)器會(huì)在HTTP首部中包含Set-Cookie的首部行,瀏覽器再向服務(wù)器發(fā)送請求時(shí)會(huì)帶上這個(gè)Cookie
- 作用域受到路徑限制 Set-Cookie:user=elharo;Path=/restricted
- 設(shè)置子域 Set-Cookie:user=elharo;Domain=example.com
- 瀏覽器發(fā)送Cookie時(shí)需要注意Path再Domain前
- 設(shè)置Expires可以設(shè)置固定的過期點(diǎn),Max-Age設(shè)置固定秒之后過期,也可以通過httponly設(shè)置只能通過http返回cookie
Session
- 服務(wù)端通過在用戶登錄時(shí)會(huì)新建一個(gè)session,同時(shí)為session分配一個(gè)ID:JSESSIONID,并將這個(gè)ID寫入到cookie中,之后將這個(gè)cookie返回給瀏覽器,瀏覽器下次請求就會(huì)帶有這個(gè)ID,之后通過ID就可以獲取到用戶的session了,當(dāng)瀏覽器禁用cookie時(shí)需要用url重寫,將JSESSIONID放入請求參數(shù)中
response.encodeRedirectURL(java.lang.String url) 用于對sendRedirect方法后的url地址進(jìn)行重寫。
response.encodeURL(java.lang.String url)用于對表單action和超鏈接的url地址進(jìn)行重寫
HTTPS
- 基于HTTP協(xié)議,通過SSL或TLS提供加密處理數(shù)據(jù),驗(yàn)證對方身份以及數(shù)據(jù)完整性保護(hù)
- SSL為安全套階層協(xié)議
- TLS為安全傳輸層協(xié)議
- 采用對稱加密和非對稱加密,數(shù)據(jù)是對稱加密傳輸?shù)模荑€是非對稱加密的
- 客戶端向服務(wù)器發(fā)起HTTPS請求,連接到服務(wù)器的443端口
- 服務(wù)器端有一個(gè)密鑰對,即公鑰和私鑰,是用來進(jìn)行非對稱加密使用的,服務(wù)器端保存著私鑰,不能將其泄露,公鑰可以發(fā)送給任何人。
- 服務(wù)器將自己的公鑰發(fā)送給客戶端。
- 客戶端收到服務(wù)器端的公鑰之后,會(huì)對公鑰進(jìn)行檢查,驗(yàn)證其合法性,如果發(fā)現(xiàn)發(fā)現(xiàn)公鑰有問題,那么HTTPS傳輸就無法繼續(xù)。嚴(yán)格的說,這里應(yīng)該是驗(yàn)證服務(wù)器發(fā)送的數(shù)字證書的合法性,關(guān)于客戶端如何驗(yàn)證數(shù)字證書的合法性,下文會(huì)進(jìn)行說明。如果公鑰合格,那么客戶端會(huì)生成一個(gè)隨機(jī)值,這個(gè)隨機(jī)值就是用于進(jìn)行對稱加密的密鑰,我們將該密鑰稱之為client key,即客戶端密鑰,這樣在概念上和服務(wù)器端的密鑰容易進(jìn)行區(qū)分。然后用服務(wù)器的公鑰對客戶端密鑰進(jìn)行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結(jié)束。
- 客戶端會(huì)發(fā)起HTTPS中的第二個(gè)HTTP請求,將加密之后的客戶端密鑰發(fā)送給服務(wù)器。
- 服務(wù)器接收到客戶端發(fā)來的密文之后,會(huì)用自己的私鑰對其進(jìn)行非對稱解密,解密之后的明文就是客戶端密鑰,然后用客戶端密鑰對數(shù)據(jù)進(jìn)行對稱加密,這樣數(shù)據(jù)就變成了密文。
- 然后服務(wù)器將加密后的密文發(fā)送給客戶端。
- 客戶端收到服務(wù)器發(fā)送來的密文,用客戶端密鑰對其進(jìn)行對稱解密,得到服務(wù)器發(fā)送的數(shù)據(jù)。這樣HTTPS中的第二個(gè)HTTP請求結(jié)束,整個(gè)HTTPS傳輸完成。
C<--Sp--S
C --Sp+Cp-->S
C --M+(Sp+Cp)-->S
對稱加密:對稱加密又叫做私鑰加密,即信息的發(fā)送方和接收方使用同一個(gè)密鑰去加密和解密數(shù)據(jù)。對稱加密的特點(diǎn)是算法公開、加密和解密速度快,適合于對大數(shù)據(jù)量進(jìn)行加密,常見的對稱加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密過程如下:明文 + 加密算法 + 私鑰 => 密文
解密過程如下:密文 + 解密算法 + 私鑰 => 明文
對稱加密中用到的密鑰叫做私鑰,私鑰表示個(gè)人私有的密鑰,即該密鑰不能被泄露。
其加密過程中的私鑰與解密過程中用到的私鑰是同一個(gè)密鑰,這也是稱加密之所以稱之為“對稱”的原因。由于對稱加密的算法是公開的,所以一旦私鑰被泄露,那么密文就很容易被破解,所以對稱加密的缺點(diǎn)是密鑰安全管理困難。
非對稱加密:非對稱加密也叫做公鑰加密。非對稱加密與對稱加密相比,其安全性更好。對稱加密的通信雙方使用相同的密鑰,如果一方的密鑰遭泄露,那么整個(gè)通信就會(huì)被破解。而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現(xiàn)。私鑰被自己保存,不能對外泄露。公鑰指的是公共的密鑰,任何人都可以獲得該密鑰。用公鑰或私鑰中的任何一個(gè)進(jìn)行加密,用另一個(gè)進(jìn)行解密。
被公鑰加密過的密文只能被私鑰解密,過程如下:
明文 + 加密算法 + 公鑰 => 密文, 密文 + 解密算法 + 私鑰 => 明文
被私鑰加密過的密文只能被公鑰解密,過程如下:
明文 + 加密算法 + 私鑰 => 密文, 密文 + 解密算法 + 公鑰 => 明文
由于加密和解密使用了兩個(gè)不同的密鑰,這就是非對稱加密“非對稱”的原因。
非對稱加密的缺點(diǎn)是加密和解密花費(fèi)時(shí)間長、速度慢,只適合對少量數(shù)據(jù)進(jìn)行加密。
在非對稱加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密算法)等。