UDP:
应用进程将消息写入UDP套接字,消息被封装成UDP数据报,该数据报进而封装到一个IP数据报,发送到目的地
1、不保证数据报会到达最终目的地
2、不保证各个数据报的先后顺序跨网络后保持不变
3、不保证数据报只到达一次
4、UDP数据报都有一个长度
5、无连接的服务
6、UDP避免了TCP的连接建立及终止所需的开销
TCP:
1、连接:在客户与服务器之间建立连接,再跨该连接交换数据,最后终止该连接。
2、可靠性:要求对端返回一个确认,如果没有接收到确认,TCP将自动重传并等待更长的时间(TCP含有动态估算往返时间的算法用来确认等待多少时间)。
3、数据排序:对每个字节关联一个序列号,分节传递给IP,接收端如果接收到非顺序到达的分节,便可以根据分节号重排;如果接受到的数据是重复的,将丢弃重复数据。
4、流量控制:任何时刻可以从对端接收的字节数(通告窗口)。
5、全双工
TCP连接建立-三路握手:
1、服务器端调用socket、bind、listen函数,准备好接收外来的连接,称之为被动打开
2、客户端调用connect函数发起主动打开,TCP发送SYN分节,告诉服务器,客户端在连接中发送数据的初始序列号。(第一个分节)
通常SYN分节不携带数据,其IP数据报包含一个IP首部,一个TCP首部及可能有的TCP选项
3、服务器确认(ACK)客户的SYN分节,同时也向客户端发送一个SYN分节,告诉客户端,服务器在连接中发送数据的初始序列号。(第二个分节)
服务器端在单个分节中发送SYN及ACK。
4、客户端确认服务器的SYN,发送ACK。(第三个分节)
TCP连接终止:
1、一端调用close函数,主动关闭,TCP发送FIN分节。(第一个分节)
2、接收到FIN分节的对端执行被动关闭,作为文件描述符发送给应用进程,由TCP确认(发送ACK,第二个分节)
3、执行被动关闭的一端调用close,向主动关闭端发送FIN分节(第三个分节)
4、主动关闭端TCP接收到FIN分节,确认(第四个分节)
在被动关闭端发送FIN分节之前,从被动关闭端向主动关闭端流动数据是可能的,称为半关闭。
序列号:
SYN、FIN分节都携带初始序列号,确认分节(ACK)携带的序列号为SYN、FIN分节序列号+1,即表示发送ACK的TCP端所期待的下一个序列号
TCP状态转换:
1、CLOSED(未打开)
2、SYN_SENT:主动打开时(客户端connect),发送SYN分节,进入SYN_SENT状态。
3、LISTEN:应用进程被动打开。
4、SYN_RCVD:接收到主动端SYN分节,并发送SYN及ACK。
5、ESTABLISHED:数据接收状态,主动打开时,接收到对端SYN分节及 ACK,并发送ACK;被动打开时,接收到ACK。
6、FIN_WAIT1:主动关闭,发送FIN
7、FIN_WAIT2:主动关闭端接收到ACK
8、CLOSING:TCP在FIN_WAIT1状态下,接收到FIN分节,发送ACK,进入CLOSING状态
9、TIME_WAIT:FIN_WAIT1状态下同时接收到FIN分节及ACK,并发送ACK;FIN_WAIT2状态下接收到FIN分节,并发送ACK;CLOSING 状态下接收到ACK。
10、CLOSE_WAIT:ESTABLISHED状态下执行被动关闭,接收到FIN同时发送ACK;
11、LAST_ACK:CLOSE_WAIT状态下发送FIN
12、LAST_ACK接收到最后一个ACK,进入CLOSED;TIME_WAIT状态下2MSL(maximum segment lifetime)超时,进入CLOSED
TIME_WAIT状态:
MSL,最长分节生命期,是任何IP数据报能够在因特网中存活的最长时间。
1、可靠的实现TCP全双工连接的终止:被动关闭TCP端在LAST_ACK状态下,等待接收的那个ACK分节丢失,那么将重发FIN分节,因此,此时客户端必须维护状态以保证对服务器的FIN分节确认,重发最终的ACK分节。
为了保证可靠的终止连接,就要处理在关闭连接时4个分节任何一个丢失的情况,因此TIME_WAIT状态出现在主动关闭TCP端,用来保证最后一个ACK的发送
2、允许老的重复分节在网络中消失:一个连接关闭后又重新建立,新连接为前连接的化身,这时要保证属于ex的老的重复分组全部在网络中消失
根据1和2,TIME_WAIT状态等待2MSL。
套接字:
1、一个套接字标识每个断点的IP地址和端口号
2、一个网络上的每个TCP连接都由一格套接字对唯一标识,一个套接字对定义该连接的两个端点的四元组:本地IP地址,本地TCP端口号,外地IP地址,外地TCP端口号
TCP缓冲区限制:
MTU:最大传输单元,是指一种通信协议在某一层上所能通过的最大数据报大小(常见1500)。两个主机之间的路径中最小的MTU称为路径MTU。超过MTU的数据报,都将执行分片,并在到达最终目的地后重组。同时,对于IPv6路由器,不对其转发的数据报分片(但是路由器本身产生的数据报同样执行分片)
最小重组缓冲区大小:IPv4或IPv6的任何实现都必须保证支持的最小数据报大小,IPv4 576,IPv6 1500
MSS:最大分节大小,用于告诉对端TCP在每个分节中能发送的最大TCP数据量。在建立TCP连接时SYN分节中的MSS选项用于告诉对端其重组缓冲区的实际大小,以避免分片。在以太网中,MSS经常设置为MTC减去IP和TCP首部的固定长度,IPv4 1500-20-20,IPv6-20-40(IP).
TCP在向对端发送数据报时,如果建立连接时收到的对端SYN分节中设置了MSS选项,则将本地MSS设置为对端通告的值。否则,设置为最小重组缓冲区减去TCP和IP首部的值,即IPv4为536,。如果数据报大于对端最小重组缓冲区时,会产生分片。通常,MSS<=MTU-40(IPv4).