TCP/IP基础
TCP/IP基础
TCP/IP协议是一个协议簇,其中包括很多协议,只是其中的TCP协议和IP协议比较重要,所以就以其命名。
TCP/IP协议簇包括应用层、传输层、网络层、网络访问层。
应用层包括HTTP、TFTP、Telnet等协议。
传输层当然主要就是TCP。
网络层包含IP、ICMP(Internet控制信息协议,ping命令就是使用的此协议)、ARP、RARP等协议。
物理地址: MAC地址
逻辑地址: IP地址
IP -> MAC称作ARP,MAC-IP称作RARP
TCP/IP四层模型:应用层、传输层、网际层、网络访问层
OSI(开发系统互联)七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
IP地址由网络ID + 主机ID构成,网络ID主要用于表现该IP大致所处的地理位置,而主机ID用于标志具体的主机。IP地址主要分为三类:A类、B类、C类。其中A类地址网络ID最短,主机ID最长,C类地址网络ID最长,主机ID最短。
tcp握手/挥手过程
TCP三次握手:
第一次:SYN,SEQ = x
第二次:SYN + ACK,SEQ = y,ACK = x + 1
第三次:ACK,SEQ = x + 1,ACK = y + 1
TCP四次挥手:
主动断开的一方:FIN, SEQ = x
另一方:ACK,SEQ = y, ACK = x + 1,表示我知道你已经想要断开连接了
另一方也准备断开:FIN + ACK, SEQ = z, ACK = x + 1
主动断开的一方:ACK, SEQ = x + 1, ACK = z + 1
为什么建立连接需要三次而断开连接需要四次
对于断开连接,考虑TCP是全双工的,双方同时可以发送和接收。第一次挥手表示客户端不再发送了。第二次挥手表示服务器知道你不发送了,所以服务器就不接收了,但是服务器可能还需要发送,所以客户端不能一次性把发送和接收都关闭了,需要等着服务器也不发送了(第三次挥手)才能把接收也关闭了(第四次挥手)。
TCP、UDP的区别
TCP,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP,用户数据报协议,提供面向报文(或称面向消息)的不可靠的通信协议。
TCP包头至少20字节,而UDP的包头最少仅为8个字节。
UDP的吞吐量不受拥塞控制的影响,只受Client生成数据的速率、传输带宽的影响。
TCP是面向流的,会存在粘包问题。UDP是面向报文的,UDP报文不会被拆分也不会被合并,而是保留报文的边界,所以Client需要选取合适的报文大小,Client之间通过报文发送和接受数据,不存在粘包的问题。
TCP是如何保证可靠性的?
消息校验、ACK回传、错误重传、流量控制、拥塞控制
消息校验
Tcp使用校验和来校验Tcp头部和数据部分的正确性。
TCP流量控制
如果发送者发送消息的速度过快,接收者来不及处理则可能会发生分组丢失的问题,为了避免分组丢失,控制发送者发送消息的速度,这就叫做TCP流量控制。
流量控制由滑动窗口实现。滑动窗口协议是一种传输层流量控制的措施,接收方通过告知发送方自己的窗口大小,进而控制发送方的消息发送速度。而窗口的大小是通过ACK包告知的。
TCP拥塞控制(慢启动)
TCP使用慢启动避免往网络中注入大量数据。TCP慢启动指的是一开始不会发送大量数据,而是在接受到的确认消息慢慢增加发送消息的大小。当发送消息的大小到达某个阈值或者消息发生了丢失,则会减少消息发送的大小。
TcpNoDelay
TCPNODELAY是一个TCP套接字选项,用于禁用Nagle算法,以便在发送数据时立即发送小数据包,而不是等待缓冲区填充。 这对于需要实时数据传输的应用程序非常有用,例如在线游戏或视频流。 Nagle算法的最初目标是为了为了小数据传输带来的网络拥堵,因为哪怕1个字节的数据传输,也至少要加上40个字节的tcp/ip协议头。
在目前,TcpNoDelay为启用状态,即禁用了Nagle算法。
TCP延迟确认
当服务器收到数据后,并不会马上答复,而是会将ACK的发送延迟一段时间(40ms),希望在这段时间内,服务端可以产生真实答复数据,ack可以随着真实的答复数据一起返回,节省网络带宽。
TCP包的包头
源端口(2字节)、目的端口(2字节)、序号(Sequence 4字节)、确认号(ACK 4字节)、窗口大小(2字节)、校验和(2字节)、头部长度(4 比特)等
UDP包的包头
源端口(2字节)、目的端口(2字节)、包大小(2字节)、校验和(2字节)