網(wǎng)絡(luò)模型
OSI:
應(yīng)用層:主要是一些終端應(yīng)用
表示層:對接受的數(shù)據(jù)進(jìn)行解釋,加密,壓縮與解壓縮
會話層:通過傳輸層數(shù)據(jù)傳輸?shù)耐?/p>
傳輸層:定義了傳輸數(shù)據(jù)的協(xié)議與端口號
網(wǎng)絡(luò)層:設(shè)備是路由器,主要將從下層接收到的數(shù)據(jù)進(jìn)行IP地址的封裝與解封
數(shù)據(jù)鏈路層:設(shè)備是交換機(jī)
物理層:定義物理設(shè)備標(biāo)準(zhǔn),如:網(wǎng)線的接口類型,光纖的接口類型,各種傳輸介質(zhì)的傳輸速率
TCP/IP:應(yīng)用層,傳輸層,網(wǎng)際層,主機(jī)至網(wǎng)絡(luò)層
網(wǎng)絡(luò)通信的三要素:
IP地址:主機(jī)的唯一標(biāo)識
端口號:正在運(yùn)行程序的標(biāo)識
傳輸協(xié)議:TCP,UDP
Socket
1.什么是 Socket?
(IP地址與端口號組合在一起)Socket 主要是用來網(wǎng)絡(luò)中兩個進(jìn)程的通信,我們需要考慮 2 個問題,第一是在網(wǎng)絡(luò)中如何定位到一臺主機(jī)并且能找到相應(yīng)的服務(wù)(因為一臺主機(jī)上可能運(yùn)行多個服務(wù)或者進(jìn)程),第二是如何可靠高效的傳輸數(shù)據(jù)。在本地可以通過進(jìn)程 PID 來唯一標(biāo)識一個進(jìn)程,但是在網(wǎng)絡(luò)中這是行不通的。其實 TCP/IP 協(xié)議族已經(jīng)幫我們解決了這個問題,網(wǎng)絡(luò)層的“ip 地址”可以唯一標(biāo)識網(wǎng)絡(luò)中的主機(jī),而傳輸層的“協(xié)議+端口”可以唯一標(biāo)識主機(jī)中的應(yīng)用程序(進(jìn)程)。這樣利用三元組(ip 地址,協(xié)議,端口)就可以標(biāo)識網(wǎng)絡(luò)的進(jìn)程了,網(wǎng)絡(luò)中的進(jìn)程通信就可以利用這個標(biāo)志與其它進(jìn)程進(jìn)行交互。網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個 socket。Socket 本質(zhì)是編程接口(API),對 TCP/IP 的封裝,Socket通常用來實現(xiàn)客戶方和服務(wù)方的連接。Socket 是 TCP/IP 協(xié)議的一個十分流行的編程實現(xiàn),一個 Socket 由一個 IP 地址和一個端口號唯一確定。但是,Socket所支持的協(xié)議種類也不光 TCP/IP 一種,因此兩者之間是沒有必然聯(lián)系的。
2 socket 的通信過程
Server 端 Listener(監(jiān)聽)某個端口是否有連接請求,Client 端向 Server 端發(fā)出Connect(連接)請求,Server 端向 Client 端發(fā)回 Accept(接受)消息。一個連接就建立起來了。Server 端和 Client 端都可以通過 Send,Write 等方法與對方通信。最后關(guān)閉 Socket。
3.TCP,UDP
UDP ,用戶數(shù)據(jù)報協(xié)議,計算機(jī)之間不必建立連接,數(shù)據(jù)打包發(fā)送,每包最多發(fā)送64K數(shù)據(jù),因為不需要建立連接,所以不安全,效率高,是不可靠協(xié)議。
TCP,傳輸控制協(xié)議,通過三次握手建立連接,通過IO流傳輸數(shù)據(jù),對數(shù)據(jù)大小沒有限制,因為建立好了連接,數(shù)據(jù)傳輸過程是安全的,是一個可靠協(xié)議,傳輸速度慢,效率低
區(qū)別
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2、TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達(dá);
UDP盡最大努力交付,即不保證可靠交付
Tcp通過校驗和,重傳控制,序號標(biāo)識,滑動窗口、確認(rèn)應(yīng)答實現(xiàn)可靠傳輸。
如丟包時的重發(fā)控制,還可以對次序亂掉的分包進(jìn)行順序控制。
3、UDP具有較好的實時性,工作效率比TCP高,適用于對高速傳輸和實時性有較高的通信或廣播通信。
4.每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)資源要求較少。
線程
1.實現(xiàn)線程的方法:
a.繼承Thread類,實現(xiàn)run方法
b.繼承runnable接口
2.簡單方法:
sleep:線程休眠
join:線程搶占
yield:線程禮讓,暫停片刻,讓CPU先執(zhí)行其他線程
setDaemon:守護(hù)線程
stop:終止線程
interrupt:中斷線程
2、Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執(zhí)行,它們有什么區(qū)別?
sleep()方法(休眠)是線程類(Thread)的靜態(tài)方法,調(diào)用此方法會讓當(dāng)前線程暫停執(zhí)行指定的時間,將執(zhí)行機(jī)會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結(jié)束后會自動恢復(fù)
wait()是Object類的方法,調(diào)用對象的wait()方法導(dǎo)致當(dāng)前線程放棄對象的鎖(線程暫停執(zhí)行),進(jìn)入對象的等待池(wait pool),只有調(diào)用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程進(jìn)入等鎖池(lockpool),如果線程重新獲得對象的鎖就可以進(jìn)入就緒狀態(tài)
3、線程的sleep()方法和yield()方法有什么區(qū)別?
① sleep()方法給其他線程運(yùn)行機(jī)會時不考慮線程的優(yōu)先級,因此會給低優(yōu)先級的線程以運(yùn)行的機(jī)會;yield()方法只會給相同優(yōu)先級或更高優(yōu)先級的線程以運(yùn)行的機(jī)會;
② 線程執(zhí)行sleep()方法后轉(zhuǎn)入阻塞(blocked)狀態(tài),而執(zhí)行yield()方法后轉(zhuǎn)入就緒(ready)狀態(tài);
③ sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常;
④ sleep()方法比yield()方法(跟操作系統(tǒng)CPU調(diào)度相關(guān))具有更好的可移植性。
4、請說出與線程同步以及線程調(diào)度相關(guān)的方法?
wait():使一個線程處于等待(阻塞)狀態(tài),并且釋放所持有的對象的鎖;
sleep():使一個正在運(yùn)行的線程處于睡眠狀態(tài),是一個靜態(tài)方法,調(diào)用此方法要處理InterruptedException異常;
notify():喚醒一個處于等待狀態(tài)的線程,當(dāng)然在調(diào)用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且與優(yōu)先級無關(guān);
notityAll():喚醒所有處于等待狀態(tài)的線程,該方法并不是將對象的鎖給所有線程,而是讓它們競爭,只有獲得鎖的線程才能進(jìn)入就緒狀態(tài);
線程池:
1.優(yōu)點(diǎn):
1)避免線程的創(chuàng)建和銷毀帶來性能消耗 ?
2)避免大量的線程間因互相搶占系統(tǒng)資源導(dǎo)致的阻塞現(xiàn)象?
3)能夠?qū)€程進(jìn)行簡單的管理并提供定時執(zhí)行,間隔執(zhí)行等功能
2.線程池包括
corePoolSize:線程池核心線程數(shù)量maximumPoolSize:線程池最大線程數(shù)量
keepAliverTime:當(dāng)活躍線程數(shù)大于核心線程數(shù)時,空閑的多余線程最大存活時間
unit:存活時間的單位
workQueue:存放任務(wù)的隊列
handler:超出線程范圍和隊列容量的任務(wù)的處理程序
3.線程池的實現(xiàn)原理
a、判斷線程池里的核心線程是否都在執(zhí)行任務(wù),如果不是(核心線程空閑或者還有核心線程沒有被創(chuàng)建)則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果核心線程都在執(zhí)行任務(wù),則進(jìn)入下個流程。
b、線程池判斷工作隊列是否已滿,如果工作隊列沒有滿,則將新提交的任務(wù)存儲在這個工作隊列里。如果工作隊列滿了,則進(jìn)入下個流程。
c、判斷線程池里的線程是否都處于工作狀態(tài),如果沒有,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果已經(jīng)滿了,則交給飽和策略來處理這個任務(wù)。