TCP/IP基础

24 阅读4分钟

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字节)