共计 1055 个字符,预计需要花费 3 分钟才能阅读完成。
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; | |
} |
参考连接
- TCP 三次握手和四次挥手过程
- TCP 和 UDP 比较
- 单链表反转总结篇
正文完
发表至: javascript
2019-05-10