一、简介和TCP/IP
2. 传输层:TCP、UDP和SCTP
2.3 用户数据报协议UDP
UDP是一种无连接的、不可靠的、基于数据报的传输层通信协议。它在传输数据时不需要建立连接,直接将数据包发送出去,因此UDP的传输效率比TCP更高。然而,由于UDP不提供可靠性保证,所以在传输过程中可能会出现数据包丢失、重复、乱序等问题。这些都需要应用层自行设计协议和算法来处理。
每个UDP数据报都有一个长度,与tcp不同。
2.4 传输控制协议TCP
2.6.1 三次握手
主机A,主机B
-
1.A→B seq=x,SYN=1 主机A请求建立连接
-
2.B→A seq=y,ACK=1,SYN=1,ack=x+1 ACK表示B确认收到A的请求,SYN表示同意建立连接 (注:这一步后,A确认了自己的发报和收报能力,因为发出去的数据有应答,就说明B已经收到了)
-
3.A→B seq=x+1,ACK=1,ack=y+1 ACK表示确认B的请求
意义
1、同步双方初始序列号:TCP协议通过序列号来确保数据的有序传输。在三次握手过程中,客户端和服务器会相互交换初始序列号,以确保后续的数据传输能够按照正确的顺序进行。
2、确认双方的接收和发送能力:通过三次握手,客户端和服务器可以确认对方是否具备接收和发送数据的能力。这有助于避免在数据传输过程中出现因对方无法接收或发送数据而导致的连接中断。
3、可以同步MSS(最大分节大小)和窗口规模大小(缓冲区大小)
2.6.3 四次挥手
- 1.A→B seq=x,FIN=1 A主机的数据发送完了,所以A发送FIN,发起了断开连接的请求
- 2.B→A seq=y,ACK=1,ack=x+1 ACK确认收到了A的数据,但是B的数据还没有传完,所以需要等B把数据包传完之后才断开连接
(注:这一步之后,B接着传输剩下的数据包) - 3.B→A FIN=1,ACK=1,seq=z,ack=x+1 B的数据传完了,所以也发送FIN表示可以断开连接
(注:这一步之后,B直接断开连接) - 4.A→B ACK=1,seq=x+1,ack=z+1 A表示收到了B的数据,可以断开连接
(注:这一步之后,A等待B的应答,经过2MSL之后,还没有收到B的回信,因为B已经关闭连接了,所以A确定B已经断开了,A也断开连接。2MSL为报文在网络上最大生存时间,超过这个时间就会被丢弃)。
为什么有TIME-WAIT?
1)可靠地实现TCP全双工连接的终止。最后一个ACK丢失时,还需要回应重新发送的FIN.
2)允许老的重复分节在网络中消逝。断开后继续连接时。
为什么是2MSL?
MSL是任何IP数据报在因特网中可以存活的最大时间。
A并不知道B是否接到自己的ACK,A是这么想的:
1)如果B没有收到自己的ACK,会超时重传FiN那么A再次接到重传的FIN,会再次发送ACK
2)如果B收到自己的ACK,也不会再发任何消息,包括ACK
无论是1还是2,A都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:
去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。
2.9 端口号
端口号用来识别同一台计算机中进行通信的不同应用程序。
端口分类
- 公认端口: 0~1023。这些端口通常与特定的系统服务和已知的应用程序紧密绑定。
- 注册端口: 1024~49151。较为松散地绑定于一些服务。也就是说,虽然有许多服务可以绑定于这些端口,但这些端口同样可以用于许多其他目的。
- 动态/私有端口:49152~65535。这些端口号理论上不应用于服务,而是常用于动态分配。它们主要在客户端进程运行时被动态地选择,因此也被称为短暂端口号或临时端口。
2.11 缓冲区大小及限制
(1)数据报大小
IPv4的数据报最大大小是65535字节,包括IPv4首部。因为首部中说明大小的字段为16位。2的16次方等于65536。
(2)MTU 最大传输单元
许多网络有一个可由硬件规定的MTU。以太网的MTU为1500字节。有一些链路的MTU的MTU可以由认为配置。IPv4要求的最小链路MTU为68字节。这允许最大的IPv4首部(包括20字节的固定长度部分和最多40字节的选项部分)拼接最小的片段(IPv4首部中片段偏移字段以8个字节为单位)IPv6要求的最小链路MTU为1280字节。
(3)分片(fragmentation)
当一个IP数据报从某个接口送出时,如果它的大小超过相应链路的MTU,IPv4和IPv6都将执行分片。这些片段在到达终点之前通常不会被重组(reassembling)。IPv4主机对其产生的数据报执行分片,IPv4路由器则对其转发的数据报进行分片。
(4)最小重组缓冲区大小(minimum reassembly buffer size)
IPv4和IPv6都定义了最小缓冲区大小,它是IPv4或IPv6任何实现都必须保证支持的最小数据报大小。其值对IPv4为576字节,对于IPv6为1500字节。例如,对于IPv4而言,我们不能判定某个给定的目的能否接受577字节的数据报,为此很多应用避免产生大于这个大小的数据报。
(5)MSS(maximun segment size)
TCP有一个最大分段大小,指的是TCP层每次能够从接收缓冲区中取出并传送给上层应用的最大数据字节数。
MSS经常设计成MTU减去IP和TCP首部的固定长度。
例如,在以太网中,MTU的默认值为1500字节,而TCP头和IP头的固定长度通常为40字节(不考虑选项字段)。因此,在以太网环境中,MSS的默认值通常为1460字节(1500 - 40 = 1460)。
如果MSS设置得太小,那么会导致TCP报文段的数量增多,从而增加了网络开销和延迟。如果MSS设置得太大,那么在网络环境较差或MTU较小的情况下,可能会导致TCP报文段被分片传输,这同样会增加网络开销和降低通信效率。
2.11.1 TCP输出
调用write返回表示把应用进程缓冲数据拷贝到套接字发送缓冲区。太多时应用程序进入休眠。
tcp正确发送数据并收到确认号才会丢弃套接字发送缓冲区的数据。
2.11.2 UDP输出
write返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。如果输出队列无足够空间,则内核会返回一个ENOBUFS错误给应用进程。