13.TCP
- TCP与UDP的区别
他们都有特点,根据特点应用场景
tcp | udp |
---|---|
面向连接,端到端,一对一 | 支持一对多 |
面向字节流的 | 面向报文的 |
传输可靠,流量控制,超时重传 | 尽大努力传输,不可靠 |
头部长,没有可选长度也要20个字节 | 头部开销少只有8个字节 |
- 为什么要有tcp?
基于ip层的传输报文,不可靠,tcp可靠
- tcp实现了哪些功能?
可靠传输,流量控制,拥塞避免,超时重传
- 三次握手的细节,为什么没有两次,或者4次
三次可以避免历史性连接,同步双发的序列号,保证点对点有序通信,三次握手能够保证双方都确认对方已收到之前发给对方的包
三次可以搞定,没必要搞四次
三次握手双方的状态
客户端 | 服务端 |
---|---|
syn_send | syn_rec |
establised | establised |
为什么是四次挥手,四次挥手的细节
为了保证客户端向服务端发送关闭连接请求时,服务端还在向客户端传输的数据还能被客户端正确收到,在第二次挥手时,ack和fin报文分开发送,ack确实收到fin报文,fin报文表示请求关闭与客户端的连接
客户端 | 服务端 |
---|---|
fin_wait_1 | close_wait |
fin_wait_2 | last_ack |
time_wait(2msl) | close |
close |
为什么是两个MSL,为什么要time_wait?
如果没有timewait,客户端直接关闭,存在在路由的服务端向客户端传输数据无法正确交付,timewait可以实现双方的同步关闭,保证数据传输和接受的可靠。
需要 TIME-WAIT 状态,主要是两个原因:
防止历史连接中的数据,被后面相同四元组的连接错误的接收;
保证「被动关闭连接」的一方,能被正确的关闭;
- 关于分片的问题
mtu(最大传输单元)
mss(最小数据包) 【见之前画的图】
- time_wait主要出现在主动关闭连接的一方
在保持长连接时,有一方突然断开连接了,因为tcp有保活机制,长时间没用信息交互时,回发送数据探测报文,如果发出的报文长时 间没有响应,就认为对方挂了,主动关闭连接。
一个服务器的某个端口能够支持的最大tcp连接数量主要取决于客户端的客户端的(ip数*端口号)
如何解决time_wait过多的问题
- 打开 net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_timestamps 选项;
- net.ipv4.tcp_max_tw_buckets
程序中使用 SO_LINGER ,应用强制使用 RST 关闭。
如果服务端要避免过多的 TIME_WAIT 状态的连接,就永远不要主动断开连接,让客户端去断开,由分布在各处的客户端去承受 TIME_WAIT。
- 关于服务端半连接和全连接的问题?
服务器半连接的状态是,收到了客户端的连接请求了但还没有让客户端确认自己已经接受
全连接的状态是三次握手已经完成之后
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。