OSI七層模型與五層網(wǎng)絡(luò)模型:
(1)OSI七層模型
OSI中的層 功能 TCP/IP協(xié)議族
應(yīng)用層 文件傳輸奴拦,電子郵件兰怠,文件服務(wù)畦攘,虛擬終端 TFTP霸妹,HTTP,SNMP知押,F(xiàn)TP叹螟,SMTP,DNS台盯,Telnet
表示層 數(shù)據(jù)格式化罢绽,代碼轉(zhuǎn)換,數(shù)據(jù)加密 沒(méi)有協(xié)議
會(huì)話層 解除或建立與別的接點(diǎn)的聯(lián)系 沒(méi)有協(xié)議
傳輸層 提供端對(duì)端的接口 TCP静盅,UDP
網(wǎng)絡(luò)層 為數(shù)據(jù)包選擇路由 IP良价,ICMP,RIP蒿叠,OSPF明垢,BGP,IGMP
數(shù)據(jù)鏈路層 傳輸有地址的幀以及錯(cuò)誤檢測(cè)功能 SLIP市咽,CSLIP痊银,PPP,ARP施绎,RARP溯革,MTU
物理層 以二進(jìn)制數(shù)據(jù)形式在物理媒體上傳輸數(shù)據(jù) ISO2110,IEEE802谷醉,IEEE802.2
(2)TCP/IP五層模型的協(xié)議
物理層:中繼器致稀、集線器、還有我們通常說(shuō)的雙絞線也工作在物理層
數(shù)據(jù)鏈路層:網(wǎng)橋(現(xiàn)已很少使用)孤紧、以太網(wǎng)交換機(jī)(二層交換機(jī))豺裆、網(wǎng)卡(其實(shí)網(wǎng)卡是一半工作在物理層、一半工作在數(shù)據(jù)鏈路層)
網(wǎng)絡(luò)層:路由器号显、三層交換機(jī)
傳輸層:四層交換機(jī)臭猜、也有工作在四層的路由器
HTTP 通信過(guò)程:
1.tcp建立鏈接(三次握手)
2.瀏覽器發(fā)送請(qǐng)求命令
3.瀏覽器發(fā)送請(qǐng)求頭消息
4.服務(wù)器應(yīng)答
5.服務(wù)器回應(yīng)頭信息
6.服務(wù)器發(fā)送數(shù)據(jù)
7.斷開(kāi)tcp鏈接(四次揮手)
三次握手和四次揮手:TCP三次握手詳解及釋放連接過(guò)程 - 老王子的博客 - 博客園
握手
1.客戶端到服務(wù)器,syn=1 ACK=0 seq=x?
2.服務(wù)器到客戶端押蚤,syn=1 ack=x+1 seq=x ACK=1
3.客戶端到服務(wù)器蔑歌,ACK=1 seq=x+1 ack=y+1
揮手
1.第一次揮手:Client發(fā)送一個(gè)FIN,用來(lái)關(guān)閉Client到Server的數(shù)據(jù)傳送揽碘,Client進(jìn)入FIN_WAIT_1狀態(tài)次屠。
2.第二次揮手:Server收到FIN后园匹,發(fā)送一個(gè)ACK給Client,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同劫灶,一個(gè)FIN占用一個(gè)序號(hào))裸违,Server進(jìn)入CLOSE_WAIT狀態(tài)。等待2MSL時(shí)間本昏。
3.第三次揮手:Server發(fā)送一個(gè)FIN供汛,用來(lái)關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)涌穆。
4.第四次揮手:Client收到FIN后怔昨,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server宿稀,確認(rèn)序號(hào)為收到序號(hào)+1趁舀,Server進(jìn)入CLOSED狀態(tài),完成四次揮手祝沸。
http請(qǐng)求包括:請(qǐng)求行矮烹,請(qǐng)求頭,空行奋隶,數(shù)據(jù)
http相應(yīng)包括:響應(yīng)行擂送,相應(yīng)頭和相應(yīng)體
http請(qǐng)求頭主要內(nèi)容:
accept:瀏覽器處理內(nèi)容類型
accept-charset:瀏覽器顯示的字符集
accept-encoding:瀏覽器處理的編碼
accept-language:瀏覽器當(dāng)前設(shè)置的語(yǔ)言
connection:瀏覽器和服務(wù)器建立的鏈接類型
cookie:當(dāng)前頁(yè)面的cookie設(shè)置
host:當(dāng)前頁(yè)面所在區(qū)域
reference:url
user-agent:瀏覽器當(dāng)前用戶代理字符串
http響應(yīng)頭主要內(nèi)容:
date:發(fā)送時(shí)間
server:服務(wù)器名字
connection:服務(wù)器和客戶端鏈接類型
content-type:文檔類型(text悦荒、application唯欣、voice、message搬味、video等)
cache-control:http緩存
http與https比較以及http版本變化:
https為密文傳遞信息境氢,安全通道,等于http+ssl碰纬,端口號(hào)為443
http為明文傳遞信息萍聊,端口號(hào)為80
http1.0 的keep-alive保持長(zhǎng)鏈接,http1.1默認(rèn)支持長(zhǎng)鏈接悦析,支持只發(fā)送header寿桨,host域,多建立鏈接强戴,請(qǐng)發(fā)請(qǐng)求亭螟。
http常見(jiàn)的異常碼:常見(jiàn)的http異常狀態(tài)碼 - qq_37819347的博客 - CSDN博客
400系列為請(qǐng)求錯(cuò)誤
500系列為服務(wù)器錯(cuò)誤
https連接過(guò)程,握手過(guò)程
建立服務(wù)器443端口連接
SSL握手:隨機(jī)數(shù),證書(shū)骑歹,密鑰预烙,加密算法
發(fā)送加密請(qǐng)求
發(fā)送加密響應(yīng)
關(guān)閉SSL
關(guān)閉TCP
網(wǎng)絡(luò)請(qǐng)求流程:
1.dns解析域名
2.tcp三次揮手建立鏈接
3.建立鏈接
4.瀏覽器發(fā)起http鏈接請(qǐng)求
5.服務(wù)器相應(yīng)請(qǐng)求
6.瀏覽器解析加載
get、post道媚、put比較:
GET:向特定的資源發(fā)出請(qǐng)求扁掸。?
POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)翘县。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改谴分。 (創(chuàng)建和更新兩個(gè)作用)
PUT:向指定資源位置上傳其最新內(nèi)容锈麸。 (主要用于更新某一內(nèi)容)
get通過(guò)url傳遞參數(shù),post放在requestbody中牺蹄,get相比post更不安全掐隐,get只能在url編碼,產(chǎn)生一個(gè)tcp數(shù)據(jù)包钞馁,把header和post一起發(fā)出去虑省。post 產(chǎn)生兩個(gè)數(shù)據(jù)包,先發(fā)送header-----服務(wù)器相應(yīng)-----發(fā)送data----服務(wù)相應(yīng)僧凰,get由于通過(guò)url傳遞參數(shù)探颈,有長(zhǎng)度限制。
udp與tcp:
udp:非面向鏈接训措、傳輸不可靠伪节、應(yīng)用場(chǎng)合數(shù)量較多、鏈接速度快绩鸣,可能丟包怀大、不保證順序、數(shù)據(jù)報(bào)文模式呀闻、多用于語(yǔ)音化借、視頻
tcp:面向鏈接、傳輸可靠捡多、應(yīng)用場(chǎng)合較少蓖康、速度慢、保證數(shù)據(jù)正確和順序垒手、采用數(shù)據(jù)流模式
常用協(xié)議:
應(yīng)用層:ftp蒜焊、http、telent科贬、ntp泳梆、smtp
傳輸層:tcp、udp
網(wǎng)絡(luò)層:IP 榜掌、ARP优妙、 PAPR
java鎖:
保證一個(gè)線程訪問(wèn)object,其他線程對(duì)object同步唐责。同步代碼塊時(shí)鳞溉,獲得這個(gè)object的對(duì)象鎖,代碼塊訪問(wèn)都會(huì)阻塞鼠哥。
volatile:
volatile標(biāo)志的變量熟菲,當(dāng)線程修改了變量的值看政,其他線程可以立即知道該變量的改變。然而對(duì)于普通變量來(lái)說(shuō)抄罕,當(dāng)一個(gè)線程修改了變量允蚣,需要先將變量寫回主內(nèi)存,其他線程從主內(nèi)存讀取變量后才對(duì)該線程可見(jiàn)呆贿。似乎從以上的描述可以推導(dǎo)出只要使用volatile修飾的變量就可以保證該變量在多線程環(huán)境下操作是安全的嚷兔,因?yàn)樗鼘?duì)于所有線程的工作內(nèi)存都是可見(jiàn)的也就是說(shuō)一致的。
java中常見(jiàn)同步與異步集合類型:
同步:vector做入、HashTable冒晰、properties、stack竟块、ConcurrentHashMap等
異步:ArrayList壶运、HashMap等
hashcode作用:
創(chuàng)建類型對(duì)應(yīng)散列表,兩個(gè)相同的對(duì)象hashcode值相等,equal返回為true浪秘。
解決hash沖突:解決Hash沖突的幾種方法 - qq_35124535的博客 - CSDN博客
hash構(gòu)造最為常用且簡(jiǎn)單的為除留余數(shù)法:哈希表長(zhǎng)為m蒋情,p為小于等于m的最大素?cái)?shù),則哈希函數(shù)為
h(k)=k??%??p?耸携,其中%為模p取余運(yùn)算棵癣。
若產(chǎn)生沖突可采用如下的兩種常用方法:
開(kāi)放定址法
這種方法也稱再散列法,其基本思想是:當(dāng)關(guān)鍵字key的哈希地址p=H(key)出現(xiàn)沖突時(shí)夺衍,以p為基礎(chǔ)狈谊,產(chǎn)生另一個(gè)哈希地址p1,如果p1仍然沖突刷后,再以p為基礎(chǔ)的畴,產(chǎn)生另一個(gè)哈希地址p2渊抄,…尝胆,直到找出一個(gè)不沖突的哈希地址pi?,將相應(yīng)元素存入其中护桦。這種方法有一個(gè)通用的再散列函數(shù)形式:
線性探測(cè)再散列
這種方法的特點(diǎn)是:沖突發(fā)生時(shí)含衔,順序查看表中下一單元,直到找出一個(gè)空單元或查遍全表二庵。
==和equal:
基本數(shù)據(jù)類型(也稱原始數(shù)據(jù)類型) :byte,short,char,int,long,float,double,boolean贪染。他們之間的比較,應(yīng)用雙等號(hào)(==),比較的是他們的值催享。
復(fù)合數(shù)據(jù)類型(類):當(dāng)他們用(==)進(jìn)行比較的時(shí)候杭隙,比較的是他們?cè)趦?nèi)存中的存放地址(確切的說(shuō),是堆內(nèi)存地址)因妙。
注:對(duì)于第二種類型痰憎,除非是同一個(gè)new出來(lái)的對(duì)象票髓,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false铣耘。因?yàn)槊縩ew一次洽沟,都會(huì)重新開(kāi)辟堆內(nèi)存空間。
在Object類中定義了一個(gè)equals的方法蜗细,這個(gè)方法的初始行為是比較對(duì)象的內(nèi)存地址裆操,但在一些類庫(kù)當(dāng)中這個(gè)方法被復(fù)寫了,如String炉媒、Integer踪区、Date。在這些類當(dāng)中equals有其自身的實(shí)現(xiàn)吊骤,而不再是比較類在堆內(nèi)存中的存放地址了朽缴。?
所以說(shuō),對(duì)于復(fù)合數(shù)據(jù)類型之間進(jìn)行equals比較水援,在沒(méi)有覆寫equals方法的情況下密强,他們之間的比較還是內(nèi)存中的存放位置的地址值,跟雙等號(hào)(==)的結(jié)果相同蜗元;
String或渤、StringBuffer與StringBuilder的區(qū)別:String,StringBuffer與StringBuilder的區(qū)別?? - Java天空 - CSDN博客
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)
String?
簡(jiǎn)要的說(shuō), String 類型和 StringBuffer 類型的主要性能區(qū)別其實(shí)在于 String 是不可變的對(duì)象, 因此在每次對(duì) String 類型進(jìn)行改變的時(shí)候其實(shí)都等同于生成了一個(gè)新的 String 對(duì)象奕扣,然后將指針指向新的 String 對(duì)象薪鹦,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因?yàn)槊看紊蓪?duì)象都會(huì)對(duì)系統(tǒng)性能產(chǎn)生影響惯豆,特別當(dāng)內(nèi)存中無(wú)引用對(duì)象多了以后池磁, JVM 的 GC 就會(huì)開(kāi)始工作,那速度是一定會(huì)相當(dāng)慢的地熄。
而如果是使用 StringBuffer 類則結(jié)果就不一樣了揭厚,每次結(jié)果都會(huì)對(duì) StringBuffer 對(duì)象本身進(jìn)行操作裂明,而不是生成新的對(duì)象,再改變對(duì)象引用左腔。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對(duì)象經(jīng)常改變的情況下。而在某些特別情況下, String 對(duì)象的字符串拼接其實(shí)是被 JVM 解釋成了 StringBuffer 對(duì)象的拼接,所以這些時(shí)候 String 對(duì)象的速度并不會(huì)比 StringBuffer 對(duì)象慢,而特別是以下的字符串對(duì)象生成中, String 效率是遠(yuǎn)要比 StringBuffer 快的.
思考:String 為什么要設(shè)計(jì)成不可變的?答案就在上面文字中。
StringBuffer
Java.lang.StringBuffer線程安全的可變字符序列。一個(gè)類似于 String 的字符串緩沖區(qū)痴晦,但不能修改露乏。雖然在任意時(shí)間點(diǎn)上它都包含某種特定的字符序列,但通過(guò)某些方法調(diào)用可以改變?cè)撔蛄械拈L(zhǎng)度和內(nèi)容劳较。
可將字符串緩沖區(qū)安全地用于多個(gè)線程衣洁。可以在必要時(shí)對(duì)這些方法進(jìn)行同步拷邢,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的忽洛,該順序與所涉及的每個(gè)線程進(jìn)行的方法調(diào)用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法环肘,可重載這些方法欲虚,以接受任意類型的數(shù)據(jù)。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串悔雹,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中复哆。append 方法始終將這些字符添加到緩沖區(qū)的末端;而 insert 方法則在指定的點(diǎn)添加字符腌零。
java.lang.StringBuilde
java.lang.StringBuilder一個(gè)可變的字符序列是5.0新增的梯找。此類提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步益涧。該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換锈锤,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類久免,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中浅辙,它比 StringBuffer 要快。兩者的方法基本相同阎姥。
集合:
三個(gè)主要接口:
set:不包含重復(fù)內(nèi)容
list:有序集合
map:鍵值對(duì)形式存儲(chǔ)
經(jīng)常對(duì)比的HashMap與HashTable
HashMap:允許key和value為null记舆,為非同步的單線程(不安全線程),可以轉(zhuǎn)化為L(zhǎng)inkHashMap遍歷呼巴,提供了對(duì)key的set遍歷泽腮。
Hashmap實(shí)現(xiàn)原理:HashMap是一個(gè)散列集合,其底層是數(shù)組+鏈表結(jié)構(gòu),主體部分是個(gè)長(zhǎng)度很長(zhǎng)的數(shù)組,主體 : Entry數(shù)組(實(shí)際存key,value的對(duì)象),鏈表 : 通過(guò)next方法指向鏈表下一個(gè)結(jié)點(diǎn)
HashTable:key和value部允許為null,是同步安全的線程伊磺,存儲(chǔ)內(nèi)容順序不可知盛正,提供了對(duì)key的Enumeration遍歷方式。
較為新的集合:sparseArray省內(nèi)存屑埋,進(jìn)行了壓縮操作豪筝,key必須為整型,使用二分查找法進(jìn)行查尋摘能。
關(guān)于object類:
object提供了:clone续崖,getclass,equals团搞,tostring严望,notify/notifyall,wait逻恐,finalize等方法像吻,其中wait釋放了當(dāng)前操作對(duì)象的控制,wait是object提供的方法复隆,而sleep是thread提供的方法拨匆,要區(qū)分對(duì)待。
JVM體系:
1.類型加載:加載.class文件挽拂。
類加載機(jī)制:查找導(dǎo)入class文件惭每,二進(jìn)制數(shù)據(jù)合并到j(luò)re中,校驗(yàn)正確性亏栈,給靜態(tài)量分配空間台腥,將符號(hào)變?yōu)橐茫瑢?duì)類靜態(tài)部分進(jìn)行初始化绒北。
java對(duì)象的引用包括:Java的四種引用方式 - 空谷幽瀾 - 博客園
強(qiáng)引用黎侈,軟引用,弱引用镇饮,虛引用
強(qiáng)引用: 是指創(chuàng)建一個(gè)對(duì)象并把這個(gè)對(duì)象賦給一個(gè)引用變量蜓竹。強(qiáng)引用有引用變量指向時(shí)永遠(yuǎn)不會(huì)被垃圾回收箕母,JVM寧愿拋出OutOfMemory錯(cuò)誤也不會(huì)回收這種對(duì)象储藐。
軟引用:如果一個(gè)對(duì)象具有軟引用俱济,內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它钙勃;
弱引用:也是用來(lái)描述非必需對(duì)象的蛛碌,當(dāng)JVM進(jìn)行垃圾回收時(shí),無(wú)論內(nèi)存是否充足辖源,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象蔚携。在java中,用java.lang.ref.WeakReference類來(lái)表示克饶。
虛引用和前面的軟引用酝蜒、弱引用不同,它并不影響對(duì)象的生命周期矾湃。在java中用java.lang.ref.PhantomReference類表示亡脑。如果一個(gè)對(duì)象與虛引用關(guān)聯(lián),則跟沒(méi)有引用與之關(guān)聯(lián)一樣邀跃,在任何時(shí)候都可能被垃圾回收器回收霉咨。
2.執(zhí)行引擎:執(zhí)行字節(jié)碼文件。
3.運(yùn)行時(shí)數(shù)據(jù)區(qū)域:方法區(qū)拍屑,堆區(qū)途戒,java棧,寄存器僵驰,本地方法棧喷斋。
方法區(qū)和堆區(qū)為共享:
方法區(qū)存放:類信息,常量蒜茴,靜態(tài)量
堆區(qū):主要存放對(duì)象
java棧星爪,本地方法棧和程序計(jì)數(shù)器為私有:
java棧:基本類型,局部變量
本地方法棧:native方法
程序計(jì)數(shù)器:執(zhí)行字節(jié)碼行號(hào)指示器
java讀取文件:
1.FileInputStream/ FileOutputStram 字節(jié)流
2.FileReader/? FileWrite 字符流
3.BufferedReader/BufferedWrite 帶緩沖區(qū)
速度比較:3>2>1
IO操作是通過(guò)object.OutputStream的流機(jī)制實(shí)現(xiàn)的通常分為三類:
BIO:同步阻塞
NIO:同步非阻塞
AIO:異步阻塞
Error和Exception的簡(jiǎn)單比較:
Error:不可控制矮男,系統(tǒng)級(jí)的錯(cuò)誤引發(fā)移必,被系統(tǒng)捕捉。
Exception:可控和不可控都有毡鉴,大多數(shù)由于人的原因?qū)е乱l(fā)崔泵,在應(yīng)用程序級(jí)別被處理,常見(jiàn)的exception分類為RuntimeException和非RuntimeException猪瞬。
接口和抽象類的簡(jiǎn)單比較:
接口:interface 名 定義憎瘸,主要包括:抽象方法,全局常量陈瘦,普通方法幌甘,static部分,權(quán)限為public,接口不允許接抽象類锅风,可extend一個(gè)父接口酥诽。
抽象類:abstract class 名 定義,主要包括:構(gòu)造方法皱埠,普通方法肮帐,靜態(tài)方法,全局常量边器,成員變量等训枢,權(quán)限為任意,但類不能用final修飾忘巧,因?yàn)閒inal修飾的類不能被繼承恒界,故抽象類不能采用。
使用方面:兩者必須定義子類砚嘴,子類必須重寫抽象方法十酣,通過(guò)子類向上轉(zhuǎn)型獲取抽象類或者接口的對(duì)象。同等情況下優(yōu)先考慮使用接口枣宫,接口使用的意圖:進(jìn)行標(biāo)注的設(shè)定婆誓,表示一種操作能力,暴露遠(yuǎn)程方法視圖也颤。
內(nèi)部類和外部類的調(diào)用:
a)內(nèi)部類可以直接調(diào)用外部類的包括private的成員變量洋幻,使用外部類引用的this關(guān)鍵字即可
b)外部類調(diào)用內(nèi)部類需要建立內(nèi)部類對(duì)象;
GC回收策略較為復(fù)雜參考:Java垃圾回收(GC)機(jī)制詳解 - 平凡希 - 博客
線程池:
ThreadPoolExecutor參數(shù):
int CorePoolSize 核心線程數(shù)最大值
int MaximumPoolPize 線程總數(shù)最大值(線程總數(shù)=核心線程數(shù)+非核心線程數(shù))
long keepAlive Time 非核心線程閑置超時(shí)時(shí)長(zhǎng)
Blocking Queue<Runnable> workQueue 任務(wù)隊(duì)列
Thread Factory 線程工廠(創(chuàng)建線程的方式)
Rejected ExceptionHandler? 拋出異常的handler
常見(jiàn)的四種線程池:
1.CacheThreadPool 可緩存的線程池:線程無(wú)限制翅娶,又空閑則復(fù)用文留,無(wú)空閑則常見(jiàn),主要減少了頻繁的創(chuàng)建和銷毀線程竭沫,減少了系統(tǒng)的開(kāi)銷燥翅。
ExecutorService cachedThreadPool=Executors.newCachedThreadPool()
2.FixedThreadPool 定長(zhǎng)線程池:控制最大的并發(fā),超出等待蜕提。
ExecutorService fixedThreadPool=Executors.newFixedThreadPool(int nThreads)
3,ScheduledThreadPool 支持定時(shí)及周期執(zhí)行任務(wù)
ExecutorService scheduledThreadPool=Executors.newScheduledThreadPool()
//延遲三秒執(zhí)行
ScheduledExecutorService?scheduledThreadPool?=?Executors.newScheduledThreadPool(5);??
scheduledThreadPool.schedule(new?Runnable()?{??
public void?run()?{??
System.out.println("delay?3?seconds");??
???}??
},3,?TimeUnit.SECONDS);?
//延遲1秒后3秒為周期執(zhí)行
ScheduledExecutorService?scheduledThreadPool?=?Executors.newScheduledThreadPool(5);??
scheduledThreadPool.scheduleAtFixedRate(new?Runnable()?{??
publicvoid?run()?{??
System.out.println("delay?1?seconds,?and?excute?every?3?seconds");??
???}??
},1,3,?TimeUnit.SECONDS);??
4.SingleThreadExecutor 單線程線程池:有且只有一個(gè)工作線程執(zhí)行森书,按照順序先進(jìn)先出(FIFO),
ExecutorService singleThreadPool=Executors.newSingleThreadPool()
未完待續(xù)..............