传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)
TCP
TCP是一种面向连接的传输层协议,可提供可靠的传输服务。
TCP端口号
端口号用来区分不同的网络服务。
0-1023为知名端口号,1024-65535为动态端口号。
TCP头部
ACK:确认标识位
ACK=1:表明确认序列号有效位,表示该数据包包含确认信息
当ACK=1时,默认其它位(URG、RSH、RST、SYN、FIN)都为0
PSH:通知接收端立即将数据提交给用户进程,不在缓存中停留,等待更多的数据
RST=1:请求重新建立TCP连接
SYN=1:请求建立连接(TCP第一个数据包可以看到SYN=1)
FIN=1:请求断开连接
窗口:指明本地可接收数据的字节数
TCP连接过程
首先,主机A向服务A请求建立连接,会发送一个TCP的SYN报文,序列号为a,SYN置1.当服务器B收到该报文时,会回复一个SYN、ACK全部置1的报文(ACK=a+1)。当主机A收到该报文时,会朝着服务器A再次发送一个ACK报文,表示连接已经建立起来了。
如上图所示,首先主机A向主机B发送SYN报文,主机B收到以后请求11。当主机A收到以后发现B需要的是11,于是向主机B发送seq=11的报文。通过三次握手建立可靠的连接。类似于我们打电话的时候:
我:XXX,我是XX
XXX:你好,我是XXX
我:我要找的就是XXX。
当确认对方的身份以后就可以看是说事了,即传输数据的过程
TCP传输过程
由于TCP建立的是可靠连接,即主机A向服务器A发送一个报文,服务器A都要进行回复。这样会造成传输速率变慢。所以采用的滑动窗口机制,如上图所示,窗口大小为3,即主机A发送三个报文,服务器A只需要回复一个确认报文。
当服务器窗口大小显示为1时,即主机A只能向服务器再发送一个报文,否则会丢包。主机通过服务器传输过来的窗口大小来进行流量的控制。
当传输过程中有个包丢掉了(此处假设是101),服务器A向主机A发送报文时,ACK=101,即再次请求seq=101的报文,如没有丢包,服务器A照常发送ACK=104的报文,即104以前的报文都接收正常。
TCP关闭连接
主机在关闭连接之前,要确认收到来自对方的ACK。
当数据传输成功时,主机A向服务器A发送一个FIN=1的报文,请求断开连接。服务器收到该报文以后回复一个ACK报文,表示OK。同时服务器也会向主机A发送请求断开连接的报文,服务器接收到主机A的回复以后断开TCP连接。即,通过四次挥手断开连接。
类似于我们打电话的时候:
我:XXX,我差不多讲完了,你有什么好补充的吗?
XXX:好像没什么好补充的
XXX:你有事就先挂了吧
我:好,那我挂了
当双方确认传输完成时才可以断开连接。
UDP
UDP是一种面向无连接的传输层协议,传输可靠性没有保证。
当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来代替TCP协议在传输层控制数据的转发。
UDP头部
UDP头部仅占8字节,传输时没有确认机制,适合实时数据传输,如语音和视频。相比较于TCP,UDP的传输效率更高,开销更小,但是无法保证数据传输的可靠性。
UDP传输过程
使用UDP传输数据时,应由应用程序根据需要提供报文到达确认、排序和流量控制。