IP协议和TCP协议详解
IP协议
IP协议的特点
IP协议是TCP/IP协议族的动力,它为上层提供无状态的,无连接、不可靠的服务。
无状态:IP通信双方不同步传输数据的状态信息,因此IP数据报的发送、传输、和接收都是相互独立,没有上下文关系的。
无连接:IP通信双方都不长久的维持对方的任何消息。所以,上层协议每次发送数据,均需要明确指明对方的IP地址。
不可靠:IP协议不能保证IP数据报准确到达接收端。发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,不重传。只发送ICMP错误信息(IP头部参数错误)。ICMP即因特网控制协议,用于检测网络连接。主要分为差错报文和查询网络信息(ping)。
注意,ping是应用程序,不是协议。
无状态的缺点:
无法处理乱序和重复的IP数据报 。接收端的IP模块只要收到了完整的IP数据报,就将其数据交给上层协议。而面向连接的协议,例如TCP,可以自己处理乱序和重复的报文段,它递交给上层的协议内容是肯定有序且正确的。
注意,IP头部字段16位的唯一标识字段,是用来处理分片和重组的,不是用来指定接收顺序的。
IPV4头部信息
IP分片
当IP数据报的长度超过帧的MTU(最大传输单元)时,它将被分片传输。
分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。
注:
1.当IP数据报被分为多个IP分片,每个IP分片都有自己的IP头部(20字节),且除了最后一个分片不设置MF(更多分片)外,其他分片均设置。
2.仅第一片的IP分片中包含ICMP头部内容,因为重组的时候,一份即可。ICMP头部长度取决于报文的类型。
重定向
ICMP重定向报文用于更新路由表。
ICMP重定向报文的数据部分,它给接收方提供了两个信息:
1.引起重定向的IP数据报的源端IP地址。
2.应该使用的路由器的IP地址。
那么接收主机即可根据这两个信息来断定引起重定向的IP数据报应该使用哪个路由器来转发,并且以此更新路由表。(更新路由表缓冲,而不是直接更新)
IPV6头部结构
- IPv6解决了IPV4地址不够用的问题,头部由40字节的固定头部和可变长的扩展头部组成
- 还增加了多播和流的功能,为网络上的多媒体内容的质量提供精细控制;
- 引入自动配置功能;增加了专门的网络安全功能。
TCP协议
TCP协议的特点
面向连接,字节流,可靠传输三大特征。
- TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。且都要分片必要的内核资源。全双工。完成数据传输后,双方断开连接释放资源。
- 基于流的。当发送端应用程序连续执行多次读操作时,TCP模块先将这些数据放入TCP发送缓冲区,TCP模块真正开始发送数据时,发送缓冲区的数据可能被封装为一个或者多个TCP报文段发出。因此TCP模块发出的TCP报文段和应用程序执行的写的次数没有固定数量关系。
- UDP基于数据报则不是。发送端每执行一次写操作,UDP模块就将其封装成一个UDP数据报发送。接收端必须及时执行读操作,否则就会丢包。(发生在慢的服务器上)。如果用户没有足够的用户缓冲区来读取UDP数据,数据将被截断。
- TCP传输是可靠的。首先采用应答机制,发送的每个报文必须得到接收方的应答才代表发送成功。其次,采用超时重传机制,发送端在发送一个TCP报文后就启动定时器,如果在指定时间内未收到应答,它将重发该报文段。
TCP头部结构
TCP头部最长是60字节,其中包含20字节的固定部分,40字节的可选部分
TCP连接的建立与关闭
三次握手建立连接,四次挥手关闭连接。
- 采用三次挥手是确保双方都能发送自己的初始序列号,并对方对自己的序列号进行确认。
- 采用四次挥手是因为当一端发起关闭连接的时候,另一端可能还有数据没发送完,所以需要将ACK和FIN关闭连接分开发送。而这种本端已经关闭连接,但允许继续接收对方的数据,直到对方也发送结束报文段以关闭连接。TCP连接的这种状态叫做半连接状态。
注意:当read系统调用返回0的时候,说明对方已经关闭连接。(还有其他的检测方法)
可以使用netstat命令来查看TCP连接状态。
- TIME-WAIT状态是当客户端收到服务端的结束报文(FIN)之后客户端处于的状态,在这个状态里,客户端连接要等待2MSL(2倍的最大报文生存时间),才能完全关闭。原因有两个:
1.可靠的终止TCP连接。(当客户端发出最后一个ACK之后,如果ACK在途中丢失,便于重发ACK能够顺利到达服务器端)
2.保证让迟来的TCP报文有足够的时间被识别并丢弃。因为当一个TCP连接处于TIME-WAIT状态时,即就无法立即使用该连接占着的端口来建立连接。如果不存在TIME-WAIT状态,那么新的连接就会收到旧的连接的迟到的报文段,就会发生错误。
异常终止连接
TCP提供了一个异常报文段的终止方式:
给对方发送一个复位报文段,发送端所有等待发送的数据的都会被丢弃。
异常终止连接
当服务器(或者客户端)关闭或者异常终止了连接,而对方并没有收到结束报文段,所以还维持着和原来一样的连接,而服务器端即使重启也没有任何连接的信息,称处于这种状态的连接为半打开连接。如果客户端往半打开状态的连接写数据,那么对方将会回复复位报文段。
TCP超时重传
TCP模块为每一个TCP报文段都维护一个重传定时器,在TCP报文第一次发送时启动,如果超时时间内没有收到应答,TCP模块将重传TCP报文段并且重置定时器。
拥塞控制
分为慢启动、拥塞避免、快速重传、快速恢复四部分。
拥塞控制的是发送端向网络一次连续写入的数据量(即发送窗口)SWND。也即发送端能连续发送的TCP报文段数量。TCP报文段最大长度为SMSS,一般等于MSS。
如果SWND太小,会引起网络延迟,如果太大,会容易导致网络拥塞。
接收端可通过其接收通知窗口(RWND)来控制发送端的SWND。但是显然是不够的,所以引入了拥塞窗口的概念,通常SWND取RWND和拥塞窗口的最小值。
- 慢启动:刚开始拥塞窗口设置为1SMSS,之后在收到一个ACK之后,指数倍增加,
- 拥塞避免:当增加到阈值的时候,改为线性增长。
- 快速重传和快速恢复:当接收到超过三次重复的确认报文段,进入快速重传阶段,阈值改为当前拥塞窗口的一半,拥塞窗口改为1SMSS。
- 之后再改为拥塞避免阶段,即拥塞窗口线性增长。