TCP及UDP协议
按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议。
TCP协议--传输控制协议
UDP协议--用户数据报协议
多路复用及多路分解
图多路复用及多路分解
接受主机中的运输层实际上并没有直接将数据交给进程,而是通过一个中间的套接字来传递。由于在任何一个时刻接受主机上可能有多个套接字,所以每个套接字都已一个唯一的标识符。
主机如何将一个收到的运输层报文段定向到合适的套接字?
为达到这一目的,在每个运输层报文段中设置了几个字段,在接收端,运输层检查并标识出接受套接字,然后将报文段定向到该套接字。
从而: 将运输层报文段中的数据交付到正确的套接字的工作叫做多路分解
从源主机的不同套接字中手机数据块,并为每个数据块封装首部信息从而生成报文段,然后将报文段传递到网络层的工作叫做多路复用
UDP协议
由RFC 768定义的UDP除了多路复用/多路分解功能及一些轻型的差错检测外,几部没对IP增加别的东西。
UDP被称为无连接的,不可靠数据传输
UDP报文段结构
首部只有四个字段,每个字段两个字节
源端口号、目的端口号:通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程
检验和:接收主机使用检验和来检查报文段中是否存在差错
长度:指明包括首部在内的UDP报文段的长度(以字节为单位)
UDP检验和
发送方的UDP对报文段的所有16比特字的和进行反码运算,求和时遇到任何语出都被回卷。得到的结果放在UDP报文段中的检验和字段。
例:假设报文段中有3个16比特字:
0110011001100000
0101010101010101
1000111100001100
前两个16比特字之和:
0110011001100000
0101010101010101
---------------------------
1011101110110101
再将上面的和与第三个字相加,得到:
1011101110110101
1000111100001100
---------------------------
0100101011000010
最后一次加法有溢出,这要被回卷(将溢出的1放到最后位继续加)。
反码:0变1,1变0
1011010100111101
此时就是检验和
在接收方,全部的4个16比特字包括检验和,一起相加。如果分组中无差错,接收方这个和将是
1111111111111111
如果其中有0那么我们就知道分组中出了差错
TCP协议
TCP协议是一个可靠数据传输协议,面向连接
进程间利用网络通信的过程中,如果数据传输的通道是一个可靠信道,即在数据在传输过程中不会产生丢失及损耗,那么进程间通信是完全可靠的。但是在实际的应用中,数据传输的通道是不可靠的,所以会产生数据的丢失等问题,为了解决这个问题,就产生了可靠数据传输协议,通过协议的方式来实现数据的可靠传输。
TCP连接在两个进程“握手”猴将连接状态完全保留在两个端系统中,TCP协议只在端系统中运行,而不再中间网络元素中运行,所以中间要素并不会维持TCP的连接状态。
TCP报文结构
源端口号和目的端口号同UDP
序号字段:32比特的
确认号字段:32比特 序号字段和确认号字段用于实现可靠的数据传输
接收窗口:16比特 用于流量控制
首部长度字段 32比特字为单位的TCP首部长度
可选与变长的选项字段 发送方与接收方协商最大报文段长度
标志字段 ACK比特--用于指示确认字段中的值有效的
RST、SYN和FIN比特用于连接建立和拆除
PSH比特被设置时,指示接收方应立即将数据交给上层
URG比特用来指示报文段里存着被发送方的上层实体置为“紧急”的数据
序号和确认号
TCP把数据看成一个无结构的但是有序的字节流。序号建立在传送的字节流上,而不是建立在传送的报文段的序列之上。一个报文段的序号因此是该报文段首字节的字节流编号。
例:主机A上的一个进程想通过一条TCP连接向主机B上的一个进程发送一个数据流。A中的TCP将隐式的对数据流中的每一个字节进行编号。假定数据流由一个包含500000字节的文件组成,MSS为1000字节,数据流的首字节编号是0。TCP将该数据流构建500个报文段。第一个报文段的序号被赋为0,第二个报文段的序号被赋为1000,第三个报文段的序号被赋为2000,以此类推。每一个序号被填入到相应TCP报文段首部的序号字段中。
确认号字段。
TCP是全双工的,因此主机A也许在向主机B发送数据的同时,也接收来自主机B的数据。
从主机B到达的每个报文段中都有一个序号用于从B流向A的数据。主机A填充进报文段的确认号是主机A期望从主机B收到的下一个字节的序号。
客户机TCP与服务器TCP通信的过程:
建立连接的三次握手:
第一步:客户机端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据,但是报文段的首部中的一个标志位(SYN比特)被置为1。另外,客户机会选择一个起始序号(client_isn),并将其放置到该起始的TCP SYN报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。
第二步:一旦包含TCP SYN报文段的IP数据到达服务器主机(假定到达),服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向客户机TCP发送允许连接的报文段。这个允许连接的报文段也不包含应用层数据。但是报文段的首部却包含了3个重要的信息。首先,SYN比特被置为1.其次该TCP报文段首部的确认号字段被置为client_isn+1.最后服务器选择自己的初始序号(server——isn),并将其放置到TCP报文段首部的序号字段中。
第三步:在收到SYN ACK报文段后,客户机也要给该连接分配缓存和变量。客户机主机还会向服务器发送另一个报文段,这个报文段对服务器的允许连接的报文段进行了确认(客户机通过将值server_isn+1放置到TCP报文段首部的确认字段中来完成此项工作)因为连接已经建立,所以该SYN比特被置为0。
数据传输:
数据传输的过程中SYN都会被置为0
断开连接的四次挥手:
参与TCP连接的两方都可以终止连接。
假设客户机打算关闭连接,客户机应用进程发出一个关闭连接命令。这会引起客户机TCP向服务器进程发送一个特殊的TCP报文段。这个特殊的报文段首部中的一个标志比特,即FIN比特被设置为1。当服务器收到该报文段后,就向客户机会送一个确认报文段。然后服务器发送其终止报文段,其FIN比特被置为1.最后,该客户机对这个服务器的终止报文进行确认。此时,两台主机商用与该连接的所有资源都被释放。