网络基本知识
网络通信的五层划分
- 应用层
- 传输层 TCP、UDP
- 网络层 路由器、IP地址、ARP、ICMP、RARP数据包Package
- 链路层 交换机、帧Frame
- 物理层 网线
TCP和UDP的区别
- TCP可靠传输,无丢包重复等
- TCP保证顺序
- TCP耗费资源较多,重量级
- TCP是面向连接的(逻辑上的连接而已,短暂重拔网线也无问题),而UDP不是
TCP的基础知识
TCP的三次握手
如图所示,三次握手。主要是要初始化Sequence Number 的初始值。
为什么要三次握手
为了防止两次握手中已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
TCP的SYN洪泛
Client发出sync请求后便丢弃,服务器进入一直重发ack阶段,从而浪费服务器资源。
第三次握手ACK失败咋办
因此,TCP后面提出新的机制,可以失败时服务器并不会重传ACK报文,而是直接发送RTS报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。原文链接
TCP如何保证顺序
依靠seq和ack双方的sequence number
TCP有几个阶段
三个,connect、传输、close阶段
accept()发生在哪个阶段
发生在传输阶段,即三次握手完成之后
TCP的四次断开握手
TCP连接是全双工的,所以它允许两个方向的数据传输被独立关闭。换言之,通信的一端可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送结束报文段以关闭连接。TCP连接的这种状态称为半关闭(half close)状态。
当客户端向服务器发送一个FIN报文段后,此连接被半关闭了。服务器发送ACK报文段来接受这个半关闭。但是服务器仍然可以发送数据,当服务器把处理完的数据都发送完毕之后,发送FIN报文段(半关闭),并且被客户发来的ACK予以确认(关闭)。
最后,TCP协议是一项很复杂的协议,很难充分的掌握,但一些皮毛和可靠性方面的基础是需要知道的。
最后的ACK失败咋办
Server会重发FIN,直到超时Close。相关链接
为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态
虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
建立连接
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
关闭连接
但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
其他
ARP
把连在同一个网上计算机的IP地址转换为该机的物理地址
###