计算机网络——传输层(TCP/UDP)

                    

在传输层有两个协议:

TCP协议:需要将要传输的文件分段传输,建立会话,可靠传输,需要流量控制(大型文件传输,视频传输)

UDP协议:一个数据包就能完成数据通信,不用分段,不需要建立会话,不可靠传输,不需要控制流量(QQ聊天,屏幕广播,多播)

传输层协议和应用层协议之间的关系

端口是什么

                    查看源图像

由上图可以看出,一个TCP报文格式有TCP首部和数据部分组成,在TCP首部有两种端口,源端口为发送请求计算机的端口号,目的端口为侦听计算机的对应服务端口号,在目的计算机当中有不同的服务,当我们需要不同服务时,我们可以发送不同请求,在目的主机中通过端口区分不同服务。

例如:我们要访问web站点,我们需要发送的TCP报文格式为

我们要使用ftp站点,我们需要发送的TCP报文格式为

端口范围 0 ~ 65535

熟知端口:数值一般为0 ~ 1023

常见的应用层协议使用的端口

  • http = TCP+80
  • https = TCP+443
  • RDP = TCP+3389
  • ftp = TCP+21
  • 共享文件夹 = TCP+445
  • SMTP = TCP+25
  • POP3 = TCP+110
  • telnet = TCP+23
  • SQL = TCP+1433
  • DNS = UDP+53

登记端口号:数值为1024 ~ 49151

客户端口号:数值为49152 ~ 65535

服务和应用层协议之间的关系

  • 服务使用TCP或者UDP的端口侦听客户端请求
  • 客户端使用IP地址定位服务器,使用目标端口定位服务
  • 可以在服务器网卡上设置只开放必要的端口,实现服务器网络安全

如何查看服务侦听的端口

在命令窗口:

  • netstat -an
  • netstat -n 查看建立的会话
  • netstat -nb 查看建立会话的进程
  • telnet 192.168.xxx.xxx xxxx测试远程计算机某个端口是否打开

UDP的主要特点

  • UDP是无连接的,即发送数据之前不需要建立连接
  • UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制
  • UDP是面向报文的。UDP没有拥塞控制,很适合多媒体通信的要求
  • UDP支持一对一、一对多、多对一和多对多的交互通信
  • UDP的首部开销小,只有8个字节

                    

TCP传输控制协议

  • TCP是面向连接的传输层协议(三次握手,建立连接)
  • 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一)
  • TCP提供可靠交付的服务
  • TCP提供全双工通信(发送方发送的同时,接收方也要给发送方反馈)
  • 面向字节流

TCP的连接

每一条TCP连接有两个端点。TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口号。TCP连接的端点叫作套接字(Socket)。端口号拼接IP地址即构成了套接字。

套接字Socket = (IP地址:端口号)

TCP连接 = {socket1,socket2} = {(IP1:port1),(IP2:port2)}

可靠通信实现

TCP协议提供了确认和重传机制,我们可以在不可靠的传输网络上实现可靠的通信。这种可靠的传输协议称为自动重传请求ARQ(Automatic Repeat reQuest)。ARQ表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。

流水线传输

发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。由于信道上一直有数据不间断的传送,这种传输方式可获得很高的信道利用率。(通信,上网,聊天,下载等)

连续ARQ协议(窗口式发送),累计确认

                    

TCP传输连接管理

传输连接有三个阶段:连接建立、数据传输、连接释放

TCP连接的建立都是采用客户服务器方式。主动发起连接建立的应用进程叫作客户,被动等待连接建立的应用进程叫作服务器。

三次握手建立TCP连接

               

  1. 客户端首先发送一个同步数据包SYN = 1(同步标记位),ACK = 0(确认标记位)seq = x(序号,x值由客户端指定),服务器收到这样的数据包就能知道这是一个主动发起建立连接的数据包。
  2. 服务器收到这样的数据包之后会发送一个回应的数据包SYN = 1,ACK = 1,seq = y(序号,y值由服务器端指定),ack = x+1(这里的确认号等于先前客户端x+1)。
  3. 客户端收到确认数据包之后,客户端再发送给服务器端一个数据包ACK = 1,seq = x+1,ack = y+1,这里不包含同步标记SYN

如果网络通畅,按道理来说第二次服务器端的回应数据包发送给客户端之后就算建立了连接,为什么还要进行第三次确认呢?首先客户端向服务器端发送一个建立连接的请求,以及服务器端向客户端确认这个请求,这两个数据包足以确定这个网络是畅通的,并且这两个数据包足以能够协商数据通信所需要的参数。 之所以要进行第三次确认是考虑到了通信线路和服务器资源的问题,如果刚开始客户端发送一个建立连接请求之后,由于线路的问题,服务器端没有收到,因此在规定的时间内客户端没有等到服务器端的回应,那么客户端会再发一个建立连接的请求,由于这次线路选择的好,服务器端收到了请求并且发送给了客户端回应数据包,就在这时,之前客户端发送的请求被服务器端收到了。由于现在客户端和服务器端已经建立了连接,这时服务器端把之前的请求回应发给客户端之后,此时的客户端是不认这个回应数据包的。而服务器端认为这个连接已经建立了,在等待客户端发送确认(这里就造成了服务器端的资源浪费),等了一段时间后没有等到确认,那么服务器就释放了。现在已经确认了的客户端再发送一个确认数据包给服务器端,服务器端收到后彼此之间就建立了完整的连接,之后的数据包就是数据传输了。

三次握手建立TCP连接的各状态

                             

TCP的连接释放

 

 

 

TCP的连接释放各状态

注意这里的等待时间,最后服务器发送了确认关闭后,客户端需要等待一段时间,而不是立马关闭。如果客户端发送给服务端的确认关闭数据包丢失了,此时服务器端会再次发送确认关闭数据包,如果此时的客户端已经关闭了,那么服务器端就永远关不掉了,因此客户端收到了服务器端的确认关闭数据包之后需要等待一段时间,是为了响应再给服务器端一个确认关闭。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章