1、TCP與UDP的優缺點面試
①TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端的可靠傳輸。對可靠性要求較高的應用層協議,如FTP、Telnet、SMTP、HTTP、POP3安全
②UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快。對實時性要求較高的應用層協DNS、SNMP、QQ服務器
③表格對比:網絡
|
TCP
|
UDP
|
是否面向鏈接
|
面向鏈接
|
無鏈接
|
數據傳輸可靠性
|
可靠的
|
不可靠的
|
應用場合
|
傳輸大量的數據
|
少許數據
|
速度
|
慢
|
快
|
2、TCP三次握手、四次揮手、存在問題socket
①TCP三次握手:spa
過程:首先Client端發送鏈接請求報文,Server段接受鏈接後回覆ACK報文,併爲此次鏈接分配資源,將客戶端加入等待連接隊列。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP鏈接就創建了。3d
②TCP四次揮手:server
過程:中斷鏈接端能夠是Client端,也能夠是Server端。blog
假設Client端發起中斷鏈接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了",可是若是你還有數據沒有發送完成,則沒必要急着關閉Socket,能夠繼續發送數據。因此你先發送ACK,"告訴Client端,你的請求我收到了,可是我還沒準備好,請繼續你等個人消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端肯定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉鏈接了"。Client端收到FIN報文後,"就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕Server端不知道要關閉,因此發送ACK後進入TIME_WAIT狀態,若是Server端沒有收到ACK則能夠重傳。「,Server端收到ACK後,"就知道能夠斷開鏈接了"。Client端等待了2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,我Client端也能夠關閉鏈接了。Ok,TCP鏈接就這樣關閉了!隊列
注意:當客戶端進入time-wait後,若是2MSL時間內不在收到服務器端的fin報文,說明服務器端已經收到客戶端的ACK應答報文,客戶端socket進入closed狀態。可是由於網絡緣由服務器未收到ACK,那麼服務器會認爲以前發送的的FIN,客戶端沒有收到,則會繼續發送FIN報文,直到收到來自客戶端的ACK報文。
③存在問題:
在安全領域,面試時會對三次握手和四次揮手會比較仔細的詢問。好比每一個步驟做用,若是缺失,會有什麼問題等。答案在上邊已有,自行總結吧。
④TCP client與server的statemerchine:
CLIENT:
SERVER:
⑤爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?
答:由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。
3、傳輸窗口控制