將String轉換爲其它類型:
Integer.parseInt(String)…
1 、集合 (這個部分的內容是頻率高的內容,個人覺得是因爲結合了數據結構,還可以結合併發安全考。其實要通關這部分,最好就是把 JDK 標準類的源碼實現一次,據說今年成都騰訊面,一位面試者寫源碼 hashmap ,順利錄取):
hashmap 底層實現,用了什麼方法解決 hash 衝突(基於 jdk 版本),具體是如何實現( jdk1.5 鏈表頭插還是尾插),爲什麼不安全?如何變得安全( concurrent 包下集合類), concurrentHashmap 實現原理是?
ArrayList 、 LinkedList 、 Vector 的底層實現和區別
HashMap 和 HashTable 的底層實現和區別,兩者和 ConcurrentHashMap 的區別。
HashMap 的 hashcode 的作用?什麼時候需要重寫?如何解決哈希衝突?查找的時候流程是如何?
Arraylist 和 HashMap 如何擴容?負載因子有什麼作用?如何保證讀寫進程安全?
TreeMap 、 HashMap 、 LinkedHashMap 的底層實現區別。
Collection 包結構的組成, Map 、 Set 等內部接口的特點與用法。
-------------------------------------------------------------------------------------------------------
A. HashMap
1). HashMap概述:
HashMap是基於哈希表的Map接口的非同步實現
此實現提供所有可選的映射操作
並允許使用null值和null鍵
此類不保證映射的順序
2)HashMap的數據結構:
哈希表是由數組+鏈表組成的,數組的默認長度爲16
數組裏每個元素存儲的是一個鏈表的頭結點
而組成鏈表的結點其實就是hashmap內部定義的一個類:Entity
Entity包含三個元素:key,value和指向下一個Entity的next
3.) HashMap的存取
HashMap的存儲--put:存儲到數組中呢一般情況是通過hash(key)%(len-1)獲得
null key總是存放在Entry[]數組的第一個元素
元素需要存儲在數組中的位置。先判斷該位置上有沒有存有Entity,沒有的話就創建一個Entity<k,v>對象,新的Entity插入(put)的位置永遠是在鏈表的最前面
HashMap的讀取--get: 先定位到數組元素,再遍歷該元素處的鏈表
覆蓋了equals方法之後一定要覆蓋hashCode方法,原因很簡單,比如,String a = new String(“abc”);String b = new String(“abc”);如果不覆蓋hashCode的話,那麼a和b的hashCode就會不同,
HashMap是基於hashing的原理,我們使用put(key, value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當我們給put()方法傳遞鍵和值時,我們先對鍵調用hashCode()方法,返回的hashCode用於找到bucket位置來儲存Entry對象。
4)解決哈希(HASH)衝突的主要方法 :
再散列法
拉鍊法
5). HashMap的resize(rehash):
HashMap中的元素越來越多的時候,hash衝突的機率也就越來越高,就要對HashMap的數組進行擴容原數組中的數據必須重新計算其在新數組中的位置,並放進去,這就是resize。負載因子loadFactor定義爲:散列表的實際元素數目(n)/ 散列表的容量(m)。那麼當HashMap中元素個數超過16*0.75=12的時候,就把數組的大小擴展爲 2*16=32,即擴大一倍
6)此實現不是同步的:
如果多個線程同時訪問一個哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須 保持外部同步Map m = Collections.synchronizedMap(new HashMap(...));
7)同步方法:ConcurrentHashMap
Hashtable的put和get方法均爲synchronized的是線程安全的。
將HashMap默認劃分爲了16個Segment,減少了鎖的爭用
寫時加鎖讀時不加鎖減少了鎖的持有時間
volatile特性約束變量的值在本地線程副本中修改後會立即同步到主線程中,保證了其他線程的可見性。
value外,其他的屬性都是final的,value是volatile類型的,都修飾爲final表明不允許在此鏈表結構的中間或者尾部做添加刪除操作,每次只允許操作鏈表的頭部。
8)HashMap 的 hashcode 的作用?什麼時候需要重寫?如何解決哈希衝突?查找的時候流程是如何?
爲什麼這麼說呢?考慮一種情況,當向集合中插入對象時,如何判別在集合中是否已經存在該對象了?(注意:集合中不允許重複的元素存在) 也許大多數人都會想到調用equals方法來逐個進行比較,這個方法確實可行。但是如果集合中已經存在一萬條數據或者更多的數據,如果採用 equals方法去逐一比較,效率必然是一個問題。此時hashCode方法的作用就體現出來了,當集合要添加新的對象時,先調用這個對象的 hashCode方法,得到對應的hashcode值,實際上在HashMap的具體實現中會用一個table保存已經存進去的對象的hashcode 值,如果table中沒有該hashcode值,它就可以直接存進去,不用再進行任何比較了;如果存在該hashcode值, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址,所以這裏存在一個衝突解決的問題,這樣一來實際調用 equals方法的次數就大大降低了
HashMap有一個叫做Entry的內部類,它用來存儲key-value對。
上面的Entry對象是存儲在一個叫做table的Entry數組中。
table的索引在邏輯上叫做“桶”(bucket),它存儲了鏈表的第一個元素。
key的hashcode()方法用來找到Entry對象所在的桶。
如果兩個key有相同的hash值(即衝突),他們會被放在table數組的同一個桶裏面(以鏈表方式存儲)。
key的equals()方法用來確保key的唯一性。
value對象的equals()和hashcode()方法根本一點用也沒有。
1)Hashtable 概述:
也是一個散列表,它存儲的內容是鍵值對(key-value)映射。
Hashtable 繼承於Dictionary,實現了Map、Cloneable、java.io.Serializable接口
Hashtable 的函數都是同步的,這意味着它是線程安全的。它的key、value都不可以爲null
Hashtable中的映射不是有序的。
Hashtable繼承於Dictionary類,實現了Map接口。Map是"key-value鍵值對"接口,Dictionary是聲明瞭操作"鍵值對"函數接口的抽象類。
2)hashtable與hashmap區別:
HashMap和Hashtable都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。
HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap可以接受爲null的鍵值(key)和值(value),而Hashtable則不行)。
HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並不是一個一定發生的行爲,要看JVM。這條同樣也是Enumeration和Iterator的區別。
由於Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那麼使用HashMap性能要好過Hashtable。
HashMap不能保證隨着時間的推移Map中的元素次序是不變的。
C.hashmap與currenthashmap區別:
Hashtable中採用的鎖機制是一次鎖住整個hash表,從而同一時刻只能由一個線程對其進行操作;
而ConcurrentHashMap中則是一次鎖住一個桶。
ConcurrentHashMap默認將hash表分爲16個段,諸如get,put,remove等常用操作只鎖當前需要用到的桶。
Hashtable是線程安全的,它的方法是同步了的,可以直接用在多線程環境中。
而HashMap則不是線程安全的。在多線程環境中,需要手動實現同步機制。
D.hashmap與linkedhashmap區別:
linkedhashmap是hashmap子類多了after和behind方法
LinkedHashMap比HashMap多維護了一個鏈表。
E.TreeMap:
TreeMap的底層使用了紅黑樹來實現,像TreeMap對象中放入一個key-value 鍵值對時,就會生成一個Entry對象,這個對象就是紅黑樹的一個節點,其實這個和HashMap是一樣的,一個Entry對象作爲一個節點,只是這些節點存放的方式不同。
存放每一個Entry對象時都會按照key鍵的大小按照二叉樹的規範進行存放,所以TreeMap中的數據是按照key從小到大排序的。
F.Arraylist 和 HashMap 如何擴容?負載因子有什麼作用?如何保證讀寫進程安全?
HashTable默認初始11個大小,默認每次擴容的因子爲0.75,
HashMap默認初始16個大小(必須是2的次方),默認每次擴容的因子爲0.75
ArrayList,默認初始10個大小,每次擴容是原容量的一半
Vector,默認初始10個大小,每次擴容是原容量的兩倍,
StringBuffer、StringBuilder默認初始化是16個字符,默認增容爲(原長度+1)*2
負載因子有什麼作用,必須在 "衝突的機會"與"空間利用率"之間尋找一種平衡與折衷. 這種平衡與折衷本質上是數據結構中有名的"時-空"矛盾的平衡與折衷.
Map m = Collections.synchronizedMap(new HashMap(...));
G.ArrayList 、 LinkedList 、 Vector 的底層實現和區別:
ArrayList是實現了基於動態數組的數據結構,LinkedList基於雙線鏈表的數據結構
ArrayList可以隨機定位對於新增和刪除操作add和remove,LinedList比較佔優勢
具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素,還能向前或向後遍歷。
Vector與ArrayList唯一的區別是,Vector是線程安全的,即它的大部分方法都包含有關鍵字synchronized,因此,若對於單一線程的應用來說,最好使用ArrayList代替Vector,因爲這樣效率會快很多(類似的情況有StringBuffer線程安全的與StringBuilder線程不安全的);而在多線程程序中,爲了保證數據的同步和一致性,可以使用Vector代替ArrayList實現同樣的功能。
H.HashSet和HashMap的區別
*HashMap* | *HashSet* |
HashMap實現了Map接口 | HashSet實現了Set接口 |
HashMap儲存鍵值對 | HashSet僅僅存儲對象(且無重複對象) |
使用put()方法將元素放入map中 | 使用add()方法將元素放入set中 |
HashMap中使用鍵對象來計算hashcode值 | HashSet使用成員對象來計算hashcode值,對於兩個對象來說hashcode可能相同,所以equals()方法用來判斷對象的相等性,如果兩個對象不同的話,那麼返回false |
HashMap比較快,因爲是使用唯一的鍵來獲取對象 | HashSet |
2 、併發 ( Executor 框架和多線程基礎):
Thread 與 Runable 如何實現多線程
--------線程同步的方法有什麼;鎖, synchronized 塊,信號量等
線程同步1)synchronized關鍵字修飾的方法當用此關鍵字修飾方法時,
內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。
2)同步代碼塊synchronized關鍵字修飾的語句塊關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步
3)使用特殊域變量(volatile)實現線程同步:volatile關鍵字爲域變量的訪問提供了一種免鎖機制使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新,.因此每次使用該域就要重新計算,而不是使用寄存器中的值,volatile不會提供任何原子操作,它也不能用來修飾final類型的變量
4)使用重入鎖實現線程同步,可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之後 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。
ReenreantLock類的常用方法有:lock和unlock
5)使用局部變量實現線程同步使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本, ThreadLocal() : 創建一個線程本地變量, get() : 返回此線程局部變量的當前線程副本中的值
6)wait與notify
調用某個對象的wait()方法能讓當前線程阻塞,並且當前線程必須擁有此對象的monitor(即鎖)
調用notifyAll()方法能夠喚醒所有正在等待這個對象的monitor的線程
--------鎖的等級:方法鎖、對象鎖、類鎖
--------生產者消費者模式的幾種實現,阻塞隊列實現, sync 關鍵字實現, lock 實現等
使用synchronized
使用Lock
使用BlockingQueue
http://blog.csdn.net/monkey_d_meng/article/details/6251879/
----------ThreadLocal 的設計理念與作用, ThreadPool 用法與優勢
線程池的底層實現和工作原理(建議寫一個雛形簡版源碼實現)
ThreadLocal 解決線程安全問題
顧名思義它是local variable(線程局部變量)。它的功用非常簡單,就是爲每一個使用該變量的線程都提供一個變量值的副本,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本衝突。從線程的角度看,就好像每一個線程都完全擁有該變量。ThreadLocal是如何做到爲每一個線程維護變量的副本的呢?其實實現的思路很簡單,在ThreadLocal類中有一個Map,用於存儲每一個線程的變量的副本。用於存儲每一個線程的變量副本,Map中元素的鍵爲線程對象,而值對應線程的變量副本。它主要由四個方法組成initialValue(),get(),set(T),remove(),其中值得注意的是initialValue(),該方法是一個protected的方法,顯然是爲了子類重寫而特意實現的
ThreadPool 降低資源消耗提高響應速度。
先定義一個線程池ThreadPoolExecutor,使用的時候用executor來調用runnable
幾個重要的線程 api , interrupt , wait , sleep , stop 等等
結束一條 Thread 有什麼方法? interrupt 底層實現有看過嗎?線程的狀態是怎麼樣的?如果給你實現會怎麼樣做?
3 、 IO ( IO,NIO ,)
IO 框架主要用到什麼設計模式
IO是面向流的,NIO是面向緩衝區的
NIO 包有哪些結構?分別起到的作用?
NIO 針對什麼情景會比 IO 有更好的優化?
Io 和 nio 有沒有了解
4 、其他的 java 語言特性 :
----------反射機制
Java可以加載一個運行時才得知名稱的class,獲得其完整結構。
Class.forName()獲取類的Class對象
getDeclaredFields()得到某個類的某個屬性
getDeclaredMethods()獲取類的方法。
classType.getDeclaredConstructor(int.class, String.class);Object inst = constructor1.newInstance();
反射獲取類Method對象,調用Field的Invoke方法調用函數。
代理模式:代理模式的作用=爲其他對象提供一種代理以控制對這個對象的訪問。
這個Dynamic Proxy其實就是一個Proxy,它不會替你作實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。
在使用動態代理類時,我們必須實現InvocationHandler接口
--------String 類內部實現,能否改變 String 對象內容,比較經典的 String 字面量筆試題 String 類可以被繼承嗎?爲什麼?
String是final的,不允許繼承
內部採用字符數組實現
一個String對象在 堆內存 中創建以後, 就不能被改變了如果我們需要可改變的字符串,則需要使用 StringBuffer 或者 StringBuilder
--------Object 有哪些公用方法?
toString方法,equals方法,hashCode方法,wait方法,notifyAll方法
try catch 塊, try 裏有 return , finally 也有 return ,如何執行這類型的筆試題
Exception 與 Error 的區別
----------泛型的優缺點在性能上不如數組快。泛型最常見的用途是創建集合類。
將類型參數化以達到代碼複用
另外就是關注最新版本 jdk 的新特性,例如 Lambda 表達式
Final 能修飾什麼?(當時我說 class 、 field 、 method ,他說還有嗎?然後又叫我不要在意,後來回想起,應該是問到我在參數裏面要不要用 final ,接下來是因爲匿名內部類)
5 、 JVM
---------自動內存管理機制, GC 算法,運行時數據區結構,可達性分析工作原理,如何分配對象內存
類加載機制,反射機制,雙親委派機制,類加載器的種類
---------Jvm 內存模型,先行發生原則, violate 關鍵字作用
方法區中存放.class文件的內容和靜態成員以及類型數據
棧存放引用
堆存放實例化的對象Eden,surviva,老年代
數據會首先分配到Eden區 當中,當Eden沒有足夠空間的時候就會 觸發jvm發起一次Minor GC。如果對象經過一次Minor GC還存活,並且又能被Survivor空間接受,那麼將被移動到Survivor空 間當中。並將其年齡設爲1,對象在Survivor每熬過一次Minor GC,
3年齡就加1,當年齡達到一定的程度(默認爲15)時,就會被晉升到老年代 中了
執行 Minor GC 操作時,不會影響到永久代
Full GC 是清理整個堆空間—包括年輕代和永久代
jvm 自動內存管理: 首先是觸發時間(新生代、老年代結構, minor gc/full gc 的觸發條件, gc 的算法 ) -> 面向的對象(可達性分析搜索不到的對象,需要考慮自我救贖的對象) -> 執行了什麼動作( gc 收集器的動作,並行和串行,例如有 stop the world )。缺點:冗餘(兩位面試官曾經提到這個問題)
GC的三種收集方法:標記清除、標記整理、複製算法的原理與特點,分別用在什麼地方,如果讓你優化收集方法,有什麼思路full gc耗時遠高於minor gc,stop the world
標記-清除收集器(Mark-Swap Collectors)標記清除之後會產生大量不連續的內存碎片。
收集過程分爲2個階段
1. 首先停止所有工作,從根集遍歷所有被引用的節點,然後進行標記,最後恢復所有工作
2. 收集階段會收集那些沒有被標記的節點,然後返回空閒鏈表
標記整理收集器分爲2個階段老年代做的是標記清理記-清除的基礎上還需進行對象的移動,成本相對較高,好處則是不會產生內存碎片
1. 標記階段, 這個階段和標記-清除收集器的標記階段相同
2. 整理階段, 這個階段將所有做了標記的活動對象整理到堆的底部(有點像是磁盤碎片整理,呵呵)
拷貝收集器(Copying Collectors)不會產生碎片內存縮小爲原來的一半
將內存分爲兩個區域(from space和to space)。所有的對象分配內存都分配到from space。在清理非活動對象階段,把所有標誌爲活動的對象,copy到to space,之後清楚from space空間。然後互換from sapce和to space的身份。既原先的from space變成to sapce,原先的to space變成from space。每次清理,重複上述過程。
GC的兩種判定方法
引用計數與引用鏈
幾種常用的內存調試工具
jmap、jstack、jconsole。
類加載的五個過程
加載、驗證、準備、解析、初始化
雙親委派模型
Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
分派:靜態分派與動態分派
一是時間不同。靜態分配發生在程序編譯和連接的時候。動態分配則發生在程序調入和執行的時候。
二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由函數malloc進行分配。不過棧的動態分配和堆不同,他的動態分配是由編譯器進行釋放,無需我們手工實現。
什麼時候
eden滿了minor gc,升到老年代的對象大於老年代剩餘空間full gc,或者小於時被HandlePromotionFailure參數強制full gc;gc與非gc時間耗時超過了GCTimeRatio的限制引發OOM,調優諸如通過NewRatio控制新生代老年代比例,通過 MaxTenuringThreshold控制進入老年前生存次數等觸發條件gc
程序員不能具體控制時間,系統在不可預測的時間調用System.gc()函數的時候;當然可以通過調優,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制進入oldObject的次數,使得oldObject 存儲空間延遲達到full gc,從而使得計時器引發gc時間延遲OOM的時間延遲,以延長對象生存期。
:對什麼東西?
超出了作用域或引用計數爲空的對象;從gc root開始搜索找不到的對象,而且經過一次標記、清理,仍然沒有復活的對象。
做什麼?
java提供finalize()方法,垃圾回收器準備釋放內存的時候,會先調用finalize()。
--------
1.強引用
2.軟引用如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存可用來實現內存敏感的高速緩存
3.弱引用一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存
4.虛引用一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。
Oom 是如何解決?
5. 除了軟引用還知道什麼引用?
6. Jvm 自動內存管理(什麼時候觸發 gc )?
7. 有什麼要補充:(跟他講了動態加載還有一個底層源碼)
CS 基礎:
1 、 OS :
--------進程和線程
a.地址空間和其它資源:進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
b.通信:進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。
c.調度和切換:線程上下文切換比進程上下文切換要快得多。
d.在多線程OS中,進程不是一個可執行的實體。
線程之間如何實現資源共享:
1將要共享的數據封裝成另外一個對象,對這個對象進行操作
2將Runnable作爲一個內部類,並在外部類中定義要共享的成員變量。
-------死鎖的必要條件,怎麼處理死鎖。
如果一個進程集合裏面的每個進程都在等待只能由這個集合中的其他一個進程(包括他自身)才能引發的事件,這種情況就是死鎖。
死鎖的四個必要條件
互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
循環等待條件(Circular wait):系統中若干進程組成環路,該環路中每個進程都在等待相鄰進程正佔用的資源。
----------段存儲,頁存儲,段頁存儲的區別。
分頁是用來從虛擬內存到物理內存映射的,每頁是最小的內存管理單元。
分段這個是用來區別代碼,數據之類的,
進程的幾種狀態和轉換
新建狀態
就緒狀態
運行狀態
阻塞狀態
死亡狀態
邏輯地址、物理地址的區別
CPU將一個虛擬內存空間中的地址轉換爲物理地址,需要進行兩步:首先將給定一個邏輯地址(其實是段內偏移量,這個一定要理解!!!),CPU要利用其段式內存管理單元,先將爲個邏輯地址轉換成一個線程地址,再利用其頁式內存管理單元,轉換爲最終物理地址。
進程調度算法
管道/FIFO/共享內存/消息隊列/信號
http://blog.chinaunix.net/uid-28458801-id-3476461.html
2 、網絡基礎(主要是 TCP 和 HTTP )
TCP 與 UDP 的區別
OSI與TCP/IP各層的結構與功能,都有哪些協議
OSI中的層 | 功能 | TCP/IP協議族 |
---|---|---|
應用層 | 文件傳輸,電子郵件,文件服務,虛擬終端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
表示層 | 數據格式化,代碼轉換,數據加密 | 沒有協議 |
會話層 | 解除或建立與別的接點的聯繫 | 沒有協議 |
傳輸層 | 提供端對端的接口 | TCP,UDP |
網絡層 | 爲數據包選擇路由 | IP,ICMP,RIP,OSPF,BGP,IGMP |
數據鏈路層 | 傳輸有地址的幀以及錯誤檢測功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理層 | 以二進制數據形式在物理媒體上傳輸數據 | ISO2110,IEEE802,IEEE802.2 |
TCP 報文結構。
區別 TCPUDP
是否連接 面向連接
面向非連接
傳輸可靠性 可靠
不可靠
應用場合 傳輸大量數據
少量數據
速度 慢 快
TCP 的三次握手與四次揮手過程,各個狀態名稱與含義, TIMEWAIT 的作用。 TCP 的三次握手過程?爲什麼會採用三次握手,若採用二次握手可以嗎?
通信雙方建立TCP連接後,主動關閉連接的一方就會進入TIME_WAIT狀態。 客戶端主動關閉連接時,會發送最後一個ack後,然後會進入TIME_WAIT狀態,再停留2個MSL時間
TCP 擁塞控制。
擁塞控制是一個全局性的過程,和流量控制不同,流量控制指點對點通信量的控制。
慢開始與擁塞避免慢開始算法的思路就是,不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。
當cwnd>ssthresh時,改用擁塞避免算法。
當cwnd=ssthresh時,慢開始與擁塞避免算法任意。
擁塞窗口cwnd慢開始門限ssthresh
快重傳算法規定,發送方只要一連收到三個重複確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。
TCP 滑動窗口與回退 N 針協議。
流量控制方面主要有兩個要點需要掌握。一是TCP利用滑動窗口實現流量控制的機制;
TCP/IP中滑動窗口的意義
動窗口的大小意味着接收方還有多大的緩衝區可以用於接收數據。發送方可以通過滑動窗口的大小來確定應該發送多少字節的數據
1.在不可靠鏈路上可靠地傳輸幀(核心功能)
2.用於保持幀的傳輸順序
3.它有時支持流量控制,這是一種接收方能夠控制發送方的一種反饋機制
http://blog.chinaunix.net/uid-26275986-id-4109679.html
Http 的報文結構。
請求報文
響應報文
Http 的常見狀態碼含義。
一、200狀態碼:成功2××:成功處理了請求的狀態碼。 ...
二、300狀態碼:重定向3×× 每次請求中使用重定向不要超過 5 次。 ...
三、400狀態碼:客戶端錯誤4×× 表示請求可能出錯,妨礙了服務器的處理。 ...
四、500狀態碼:服務器錯誤5×× 表示服務器在處理請求時發生內部錯誤。 ...
Http request 的幾種類型
Http1.1 和 Http1.0 的區別
Http 怎麼處理長連接。
HTTP1.1規定了默認保持長連接(HTTP persistent connection ,也有翻譯爲持久連接),數據傳輸完成了保持TCP連接不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸數據;相反的就是短連接。
Cookie 與 Session 的作用於原理
cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。
訪問 www.xxx.com ,描述一下這個過程發生什麼
DNS、HTTP、TCP、OSPF(OpenShortestPathFitst,ospf)開放最短路徑優先協議、IP協議IP協議是用於將多個包交換網絡連接起來的,它在源地址和目的地址之間傳送一種稱之爲數據包的東西,它還提供對數據大小的重新組裝功能,以適應不同網絡對包大小的要求。、ARP地址解析協議是根據IP地址獲取物理地址的一個TCP/IP協議
ICMP的主要職責就是報告差錯,ICMP差錯報告報文共有五種:目的站不可到達,源站抑制,超時,參數問題,改變路由
1.在瀏覽器裏輸入要網址
2.瀏覽器先嚐試從Host文件中獲取http://www.baidu.com/對應的IP地址,如果能取到當然萬事大吉大家都能嗨,如果不能,就使用DNS協議來獲取IP咯。
在DNS協議中,PC會向你的本地DNS服務器求助(一般是路由器),希望從本地DNS服務器那裏得到百度的IP,得到就好,得不到還得向更高層次的DNS服務器求助,最終總能得到百度的IP。
一個DNS解析過程,把http://www.mytest.com/變成ip,如果url裏不包含端口號,則會使用該協議的默認端口號
3.要建立一個socket連接建立TCP連接
4.開始向web服務器發送請求GET 路徑/文件名 HTTP/1.0發送HTTP 請求報文
5.Web服務器首先傳送一些HTTP頭信息,然後傳送具體內容(即HTTP體信息)
6.關閉連接:當應答結束後,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器能夠與Web服務器建立連
socket 通信的幾個關鍵函數
SOCKET socket(int af, int type, int protocol);
int bind( SOCKET s, const struct sockaddr* name, int namlen );綁定到本地,name中指定的IP應該是當前運行該程序機器的IP。
int listen(SOCKET s, int backlog);
SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen );------KHD:int connect( SOCKET s, const struct sockaddr FAR* name, int namelen );連接到服務器
int send( SOCKET s, const char* buf, int len, int flags );
int recv( SOCKET s, char* buf, int len, int flags );
inet_ntoa( char FAR* PASCAL FAR inet_ntoa( struct in_addr in);將網絡地址轉換成“.”點隔的字符串格式
IP 地址分類
瞭解交換機、路由器、網關的概念,並知道各自的用途
交換機工作於OSI參考模型的第二層,即數據鏈路層。
路由工作在OSI模型的第三層——即網絡層,
物理層
設備,中繼器(repeater),集線器(hub)。對於這一層來說,從一個端口收到數據,會轉發到所有端口。
鏈路層
因爲有了MAC地址表,所以才充分避免了衝突,因爲交換機通過目的MAC地址知道應該把這個數據轉發到哪個端口。而不會像HUB一樣,會轉發到所有滴端口。所以,交換機是可以劃分衝突域滴。
網絡層
四個主要的協議:
網際協議IP:負責在主機和網絡之間尋址和路由數據包。
這再一次證明了,ip包是不可靠的。因爲它不保證送達。
路由表中的每一項都包含下面這些信息。
1目的IP地址
2下一站路由器
3標誌是網絡地址還是主機地址,標誌下一站路由器是否爲真正的下一站路由器
4爲數據報的傳輸指定一個網絡接口
如果IP數據包的TTL(生命週期)以到,則該IP數據包就被拋棄。
搜索路由表,優先搜索匹配主機,如果能找到和IP地址完全一致的目標主機,則將該包發向目標主機
搜索路由表,如果匹配主機失敗,則匹配同子網的路由器,這需要“子網掩碼(1.3.)”的協助。如果找到路由器,則將該包發向路由器。
搜索路由表,如果匹配同子網路由器失敗,則匹配同網號(第一章有講解)路由器,如果找到路由器,則將該包發向路由器。
搜索陸游表,如果以上都失敗了,就搜索默認路由,如果默認路由存在,則發包
如果都失敗了,就丟掉這個包。
地址解析協議ARP:獲得同一物理網絡中的硬件主機地址。
必須把IP目的地址轉換成以太網網目的地址。在這兩種地址之間存在着某種靜態的或算法的映射,常常需要查看一張表。地址解析協議(Address Resolution Protocol,ARP)就是用來確定這些映射關係的協議
地址解析協議ARP:獲得同一物理網絡中的硬件主機地址。
網際控制消息協議ICMP:發送消息,並報告有關數據包的傳送錯誤。
互聯組管理協議IGMP:被IP主機拿來向本地多路廣播路由器報告主機組成員。
該層設備有三層交換機,路由器。
http://blog.csdn.net/zh634455283/article/details/7956521
傳輸層
兩個重要協議 TCP 和 UDP 。
端口概念:TCP/UDP 使用 IP 地址標識網上主機,使用端口號來標識應用進程,即 TCP/UDP 用主機 IP 地址和爲應用進程分配的端口號來標識應用進程。端口號是 16 位的無符號整數, TCP 的端口號和 UDP 的端口號是兩個獨立的序列。儘管相互獨立,如果 TCP 和 UDP 同時提供某種知名服務,兩個協議通常選擇相同的端口號。這純粹是爲了使用方便,而不是協議本身的要求。利用端口號,一臺主機上多個進程可以同時使用 TCP/UDP 提供的傳輸服務,並且這種通信是端到端的,它的數據由 IP 傳遞,但與
IP 數據報的傳遞路徑無關。網絡通信中用一個三元組可以在全局唯一標誌一個應用進程:(協議,本地地址,本地端口號)。
也就是說tcp和udp可以使用相同的端口。
可以看到通過(協議,源端口,源ip,目的端口,目的ip)就可以用來完全標識一組網絡連接。
應用層
基於tcp:Telnet FTP SMTP DNS HTTP
基於udp:RIP NTP(網落時間協議)和DNS (DNS也使用TCP)SNMP TFTP
單例模式爲什麼要 sync .class 而不是 this
數據結構和算法:
劍指 offer
編程之美
Cracking
程序員代碼面試指南
特別是這四本書上的重複題
-
有兩根一樣的繩子,每一根燃燒都要1個小時(不能將繩子對摺),如何測量出15分鐘的時間
數學kmxy5562014-12-05
優點:我沒事的時候喜歡坐一下公交,看一下公交路線,有哪些重疊的地方,如何優化…… ” 。
Java 基礎:
深入理解 java 虛擬機 — 周志明
Java 編程思想
Effective java
Core java
Java 網絡編程 —Elliotte Rusty Harold
Java 併發編程實戰
CS 基礎:
TCP/IP 協議簇
圖解 Http
TCP/IP 詳解卷卷一
深入理解計算機操作系統
鳥哥的 LINUX 私房菜基礎篇
C Primer Plus
C++ Primer
C 語言程序設計語言
C 專家編程
C 與指針
C++ 程序設計語言
Effective C++ :改善程序與設計的 55 個具體做法
深度探索 C++ 對象模型
C++ 標準庫(第 2 版)
虎書(前 2 章,可以應付學院內編譯原理考試)、龍書、鯨書
算法和數據結構:
算法 -Robert Sedgewick
劍指 offer
編程之美
Cracking the coding interview
程序員代碼面試指南 — 左程雲
Leetcode 這個是 OJ ,刷了 10 題後來沒刷
算法導論(數學水平太差看不懂)