1、TCP的三次握手和四次揮手
1.1 三次握手:
客戶端請求 -> 服務器響應 -> 客戶端確認收到響應,建立連接(保證網絡正常)
1.2 四次揮手
客戶端請求 -> 服務器響應該請求 -> 服務器確認數據傳送完畢, 發送關閉連接的響應 -> 客戶端發送響應,在2MSL內未收到回覆則視爲服務器端已收到該響應並關閉連接接口,客戶端關閉連接。
1.3 爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。
2、TCP和UDP的區別、比較
UDP | TCP | |
---|---|---|
是否連接 | 無連接 | 面向連接 |
是否可靠 | 不可靠傳輸,不使用流量控制和擁塞控制 | 可靠傳輸,使用流量控制和擁塞控制 |
連接對象個數 | 支持一對一,一對多,多對一和多對多交互通信 | 只能是一對一通信 |
傳輸方式 | 面向報文 | 面向字節流 |
首部開銷 | 首部開銷小,僅8字節 | 首部最小20字節,最大60字節 |
適用場景 | 適用於實時應用(IP電話、視頻會議、直播等) | 適用於要求可靠傳輸的應用,例如文件傳輸 |
3、鏈表反轉
鏈表反轉有兩種方法:
- 就地反轉法
//就地反轉法
interface ListNode {
value: string;
next: ListNode;
}
function reverseList1(head:ListNode) {
if (head == null)
return head;
let dummy = null;
dummy.next = head;
let prev = dummy.next;
let pCur = prev.next;
while (pCur != null) {
prev.next = pCur.next;
pCur.next = dummy.next;
dummy.next = pCur;
pCur = prev.next;
}
return dummy.next;
}
- 頭節點插入法
interface ListNode {
value: string;
next: ListNode;
}
function reverseList2(head: ListNode) {
let dummy = null;
let pCur = head;
while (pCur != null) {
ListNode pNex = pCur.next;
pCur.next = dummy.next;
dummy.next = pCur;
pCur = pNex;
}
return dummy.next;
}
參考連接