网络基础知识
经典协议
TCP 为什么需要三次握手四次挥手
- 三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
- 因为连接是全双工的,双方必须都收到对方的FIN包及确认才可关闭。
为什么time_wait要等2msl
TCP为什么需要流量控制
- 由于通讯双方,网速不同。通讯方任一方发送过快都会导致对方消息处理不过来,所以就需要把数据放到缓冲区中
- 如果缓冲区满了,发送方还在疯狂发送,那接收方只能把数据包丢弃。因此我们需要控制发送速率。
- 我们缓冲区剩余大小称之为接收窗口,用变量win表示。如果的win=0,则发送方停止发送。
TCP为什么需要拥塞控制
- 流量控制与拥塞控制是两个概念,拥塞控制是调解网络的负载。
- 接收方网络资源繁忙,因未及时相应ACK导致发送方重传大量数据,这样将会导致网络更加拥堵。
- 拥塞控制是动态调整win大小,不只是依赖缓冲区大小确定窗口大小。
为什么会出现粘包/拆包?
- 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
- 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
- 进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。
- 接收方法不及时读取套接字缓冲区数据,这将发生粘包。
如何获取完整应用数据报文?
- 使用带消息头的协议,头部写入包长度,然后再读取包内容。
- 设置定长消息,每次读取定长内容,长度不够时空位补固定字符。
- 设置消息边界,服务端从网络流中按消息边界分离出消息内容,一般使用\n’。
- 更为复杂的协议,例如json、protobuf
golang的tcp小demo
解码部分
|
|
客户端部分
|
|
服务器部分
|
|
运行后可以看到
golang创建udp服务器和客户端
客户端
|
|
服务端
|
|
tcp实现
如果没有deferclose会出现什么情况
如果server端没有close,客户端会停在FIN_WAIT_2,服务器会停在CLOSE_WAIT
golang创建http服务器和客户端
|
|
测试得到
|
|