一、传输层的作用
1、 跟踪各个会话
因为每台主机上可能有多个进程进行通信,传输层需要将各个数据段发送给相应的进程。这也可以理解,在传输层报头中加入了源和目的进程号(其实就是端口号)。
2、 分段数据并管理每个分段(源)
3、 重组数据(目的)
4、 标识应用程序
这一条和第一条类似,用端口号标识。
5、 流量控制
6、 错误恢复
7、 开始会话
二、端口号
类型:
公认端口——端口0到1023(210-1)
公认端口用于服务和应用程序。都是一些常用的应用程序所采用。
例如:FTP(端口20,21);HTTP(端口80);DNS(端口53)
已注册端口——端口1024到49151
分配给用户进程或应用程序。这些应用程序是用户选择安装的一些应用程序,不是已经分配了公认端口的常用应用程序。
这些端口在没有被服务器资源占用时,可由客户端动态选用为源端口。
例如:MSN Messenger(端口1812);HTTP备用(端口8008,8080)
动态或私有端口——端口49152到65535
也称为临时端口。这些端口往往在开始连接时被动态分配给客户端应用程序。客户端一般很少使用动态或私有端口服务(只有一些点对点文件共享程序使用)。
三、TCP头结构
TCP协议头最少20个字节,包括以下的区域:
TCP源端口(SourcePort):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是标示报文的返回地址。
TCP目的端口(Destinationport):这个端口指明报文接收计算机上的应用程序地址接口。
TCP序列号(序列码,SequenceNumber):32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1.
确认号(Acknowledgment Number):32位的序列号由接收端计算机使用,重组分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的下一个包的序列码。
注:可以将确认号简单理解为准备接收地下一个包得序列码。
数据偏移量(HLEN):4位包括TCP头大小,指示何处数据开始。
保留(Reserved):6位值域,这些位必须是0.为了将来定义新的用途所保留。
标志(Code Bits):6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN.
窗口(Window):16位,用来表示窗口大小。
校验位(Checksum):16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性。
优先指针(紧急,Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
选项(Option):长度不定,但长度必须以字节。如果没有选项就表示这个一字节的域等于0.
填充:不定长,填充的内容必须为0,它是为了数学目的而存在。目的是确保空间的可预测性。保证包头的结合和数据的开始处偏移量能够被32整除,一般额外的零以保证TCP头是32位的整数倍。
[NextPage]
四、TCP三次握手
第一次握手(申请):建立连接时,客户端发送SYN包(SYN=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize SequenceNumbers)。
第二次握手(回复+申请):服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手(回复):客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
五、通信中各种状态
LISTENING:监听来自远方TCP端口的连接请求。
SYN-SENT:在发送连接请求后等待匹配的连接请求。
SYN-RECE:在收到和发送一个连接请求后等待对连接请求的确认。
ESTABLISHED:代表一个打开的连接,数据可以传送给用户。
FIN-WAIT-1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
FIN-WAIT-2:从远程TCP等待连接中断请求。
CLOSE-WAIT:等待从本地用户发来的连接中断请求。
CLOSING:等待远程TCP对连接中断的确认。
LAST-ACK:等待原来发向远程TCP的连接中断请求的确认。
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认。
CLOSED :没有任何连接状态。
可以用netstat命令查看一下主机现在建立的连接和状态。
六、TCP会话终止
若要关闭连接,应设置数据报头重的FIN控制标志,需采用包含FIN数据段和ACK数据段的二次握手,因此要终止一个TCP支持的整个过程,需要实施4次交换,以终止两个双向会话。也可以用三次握手来终止(四次握手中的二、三两次合并为一次)。
[NextPage]
七、TCP重传
关于确认号的一个小细节:如果接收到序列号为1500到3000以及3400到3500的数据段,那么确认号应当为3001.这是因为未接收到3001到3399之间的数据段,此时准备接收的下一个数据段的序列号为3001.
TCP的标准实施流程是:主机传输数据段,并将数据段的副本列入重新发送队列,然后启动计时器。当接收到数据确认信息时,主机将从队列中删除对应数据段;如果到及时器超时还没有收到确认信息,将重新传输数据段。
现在的主机还有一项备选功能:选择性确认。如果两台主机都支持选择性确认功能,目的主机便可以确认间断数据段中得数据,那么源主机就只要传输丢失的数据。
八、TCP的拥塞控制
主要要清楚的就是动态窗口大小控制,来使得每个TCP会话有最佳的窗口大小。
九、UDP协议:低开销通信
UDP是一种简单协议,提供了基本的传输层功能。与TCP相比,UDP开销极低,因为UDP是无连接的,并且不提供复杂的重新传输、排序和流量控制机制。
与TCP的通信机制不同,由于UDP是无连接的协议,因此通信发生之前不建立会话。UDP是基于事务的,换言之,应用程序要发送数据时,它仅是发送数据而已。由于不建立会话,因此一旦数据和端口号准备就绪,UDP就可以生成数据报并递交给网络层,并在网络上寻址和发送。
因为UDP不进行排序,所以数据到达的时候只是按先来后到的顺序进行排列。如果数据的顺序对应用程序很重要,那么应用程序只能自己标志数据的正确顺序,并决定如何处理这些数据。
TCP与UDP的关键区别在于可靠性。