写出TCPUDP通信过程中客户端和服务端论坛大体的步骤

《计算机网络基础》课程作业

年級:2012春学习中心:浙大校内直属学习

中心(西溪)—————————————————————————————

1.从资源共享的角度来萣义计算机网络计算机网络指的是利用_通信线路

_______将不同地理位置的多个独立的__自治计算机系统________连接起来以实现资源共享的系统。

2.从传输范围的角度来划分计算机网络计算机网络可以分为_____局域网

3.在TCP/IP的应用层协议使用的是___客户服务器方式_______,在这里客户

是服务请求方,服务器是服务提供方美国的IBM公司在1974年宣布了它研制的网络体系结构____ SNA ______。

4.通信线路的__带宽_______是指通信线路上允许通过的信号频带范围(或通频

带) 单位是HZ。但在计算机网络中它又用来表示网络的通信线路所能传送数据的能力。

5.数据通信中的信道传输速率单位用b/s表示b/s的含义是___每秒比特

6.目前,“带宽”常用作描述信道传送数据能力的物理量其单位是 b/s (bit/s),

7.将计算机网络划分为局域网LAN、城域网MAN、广域网WAN是按______网络的

作用范围(戓覆盖的范围)____划分的。

8.各节点都与中心节点连接呈辐射状排列在中心节点周围,这种拓扑结构称为

9.假设某用户通过电线部门的ADSL技术以2M(即2Mb/s)带宽接入Internet

在正常情况下其下载速度大约是____ 244KB(大写B表示字节)_____。

10.在发送报文之前先将较长的报文划分成为一个个更小的等长数据段,茬每一

  • 1、发送ARP协议包获取默认网关的Mac地址
  • 2、组织数据发送给默认网关(ip是DNS服务器的ip但是Mac地址是默认网关的Mac地址)
  • 3、默认网关拥有转发数据的能力,把数据转发给路由器
  • 4、路由器根据自己的路由协议来选择一个合适的较快的路径,转发数据给目的网关
  • 5、目的网关(DNS服务器所在的网关)把数据转发给DNS服务器
  • 6、DNS服務器查询解析出对应的ip后会发送tcp3次握手进行连接
  • 3、使用http协议发送请求给web服务器
  • 4、web服务器收到数据请求之后,通过查询自己的服务器得到楿应的结果后返回给浏览器
  • 5、浏览器接收到数据后通过浏览器自己的渲染功能来显示这个网页
  • 6、浏览器关闭tcp连接,4次挥手(结束)
  • 网上找了一张很便于理解的图如下:

    • 2、服务器端接收到客户端的数据包后,由SYN=1知道请求建立连接并向客户端发送确认TCP连接请求的报文,其Φ包括:seq序列号(有服务器端随机生成)并将SYN标志位置1,ACK标志位置1ack字段在客户端发过来的seq值的基础上加1(SYN=1,ACK=1ack=x+1,seq=yx为客户端发过来的seq徝,y是服务器端生成的随机数)此时服务器进入SYN_RCVD状态;
    • 3、客户端收到服务器端发送的TCP验证请求后,检查ACK是否为1ack是否为x+1,如果正确则將ACK标志位置1,ack=y+1并将数据包发送给服务器,服务器检查ACK是否为1ack是否为y+1,如果是则连接建立成功,客户端和服务器进入ESTABLISHED状态此时完成彡次握手,随后就可以进行数据传输了!

    三次握手过程中客户端和服务器端的状态变化

    • 1、客户端发送断开TCP连接的请求报文并停止发送数據。发送的报文中FIN标志位置1,表示请求断开连接seq序列号由客户端随机生成(FIN=1,seq=x其中x由客户端随机生成)
    • 2、服务器端收到客户端的请求报文,由FIN=1得知客户端请求断开连接并发出确认报文,其中ACK标志位置1ack字段在客户端发送的seq值的基础上加1(ACK=1,ack=x+1seq=y,其中x是客户端发送的seq徝y由服务器随机生成)
    • 3、服务器端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开服务器端会先确保断开前,所有传输到客戶端的数据是否传输完毕一旦确认数据传输完毕,就会回复:FIN=1ACK=1,ack=x+1seq=z
    • 4、客户端收到服务器端的服务器端的断开连接请求(由FIN=1确定)后,發送确认报文ACK标志位置1,ack为服务器端的seq值加1seq序列号为服务器端的ack值

    四次挥手过程的客户端及服务器端的状态变化

    TCP三次握手和四次挥手嘚11个状态:

    • LISTEN:等待从任何远端TCP 和端口的连接请求。
    • SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求
    • SYN_RECEIVED:发送连接请求并且接收到匹配的連接请求以后等待连接请求确认。
    • ESTABLISHED:表示一个打开的连接接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态
    • FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认
    • CLOSE_WAIT:等待本地用户的连接终止请求。
    • CLOSING:等待远端TCP 的连接终止请求确认
    • LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
    • TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
        • 1.可靠的实现tcp全双工连接的终止;
        • 2.允许老的重复分节在网络中消逝
  • CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)
  • TCP的长连接和短连接

    • 1、客户端向服务端论坛发起连接请求
    • 2、服务端论坛收到请求后双方建立连接(3次握手后)
    • 3、客户端向服务端论坛发送数据
    • 4、服务端论坛接收数据并处理后回应客户端
    • 5、一次读写完成后,此时双方任何一个发起close操作(一般是客户端发起close操作当然不排除特殊情况)

    操作步骤: 建立连接—>数据传输—>关闭连接…建立连接—>数据传输—>关闭连接

    应用场景: WEB网站的http服务一般都用短链接,因为长連接对于服务端论坛来说会耗费一定的资源而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接而且同时有成千上万的用户,如果每个用户都占用一个连接的话那可想而知吧。所以并发量大但每个用户无需频繁操作情况下需鼡短连好。

    优缺点: 短连接对于服务器来说管理较为简单存在的连接都是有用的连接,不需要额外的控制手段但如果客户请求频繁,將在TCP的建立和关闭操作上浪费时间和带宽

    • 1、客户端向服务端论坛发起连接请求
    • 2、服务端论坛收到请求后,双方建立连接(3次握手后)
    • 3、愙户端向服务端论坛发送数据
    • 4、服务端论坛接收数据并处理后回应客户端
    • 5、一次读写完成后连接不关闭
    • 7、长时间操作后,发起客户端关閉请求

    操作步骤: 建立连接—>数据传输…(保持连接)…数据传输—>关闭连接

    应用场景: 长连接多用于操作频繁点对点的通讯,而且连接数不能太多情况每个TCP连接都需要三次握手,这需要时间如果每个操作都是先连接,再操作的话那么处理速度会降低很多所以每个操作完后都不断开,再次处理时直接发送数据包就OK了不用建立TCP连接。例如:数据库的连接用长连接如果用短连接频繁的通信会造成socket错誤,而且频繁的socket 创建也是对资源的浪费

    长连接可以省去较多的TCP建立和关闭的操作,减少浪费节约时间。对于频繁请求资源的客户来说较适用长连接。client与server之间的连接如果一直不关闭的话会存在一个问题,随着客户端连接越来越多server早晚有扛不住的时候,这时候server端需要采取一些策略如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务

    • 1、基于连接与无连接;UDP是无连接嘚( 写信 ),即发送数据之前不需要建立连接TCP是面对连接的( 打电话 );
    • 2、TCP提供可靠的服务,保证数据正确性UDP可能会丢包。TCP保证数据順序UDP不保证。也就是说通过TCP连接传送的数据,无差错不丢失,不重复且按序到达;UDP尽最大努力交付,即不保证可靠交付(Tcp通过校验囷重传控制,序号标识滑动窗口、确认应答实现可靠传输。如丢包时的重发控制还可以对次序乱掉的分包进行顺序控制。)
    • 3、UDP具有較好的实时性工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信
    • 4、TCP连接只能是点到点的;UDP支持一对一,一对多多对┅和多对多的交互通信。
    • 5、TCP对系统资源要求较多UDP对系统资源要求较少。

    通过本实验学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的

    Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样一个socket允许应用程序添加到网络中,并与处于同一个网络中嘚其他应用程序进行通信一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然

    不同类型的socket與不同类型的底层协议族以及同一协议族中的不同协议栈相关联。现在TCP/IP协议族中的主要socket类型为流套接字(sockets sockets)和数据报套接字(datagram sockets)

    流套接芓将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议)提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息一个TCP/IP套接字由一个互联网哋址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定

    当一个客户端向一个已经被其他客户端占用的服务器发送连接请求时,虽然其在连接建立后即可向服务器端发送数据服务器端在处理完已有客户端的请求前,却不会对新的客户端作出响应

    并行服务器:可以单獨处理没一个连接,且不会产生干扰并行服务器分为两种:一客户一线程和线程池。每个新线程都会消耗系统资源:创建一个线程将占鼡CPU周期而且每个线程都自己的数据结构(如,栈)也要消耗系统内存另外,当一个线程阻塞(block)时JVM将保存其状态,选择另外一个线程运行并在上下文转换(context switch)时恢复阻塞线程的状态。随着线程数的增加线程将消耗越来越多的系统资源。这将最终导致系统花费更多嘚时间来处理上下文转换和线程管理更少的时间来对连接进行服务。那种情况下加入一个额外的线程实际上可能增加客户端总服务时間。

    我们可以通过限制总线程数并重复使用线程来避免这个问题与为每个连接创建一个新的线程不同,服务器在启动时创建一个由固定數量线程组成的线程池(thread pool)当一个新的客户端连接请求传入服务器,它将交给线程池中的一个线程处理

    当该线程处理完这个客户端后,又返回线程池并为下一次请求处理做好准备。如果连接请求到达服务器时线程池中的所有线程都已经被占用,它们则在一个队列中等待直到有空闲的线程可用。

    4、写一个简单的chat程序并能互传文件,编程语言不限

    1、使用TCP进行的数据收发

    使用TCP的网络连接,需要用到pythonΦ的socket模块所以首先需要在代码中,将它导入进来:

    接下来需要制定TCP通信的端口号这里的IP地址选为127.0.0.1,即本地服务器local host:

    端口号的制定可以隨意只要确保客户端和服务器使用的是同一组端口即可。接下来需要使用socket关键字声明一个新的套接字用于接下来的通信过程,操作为:sk=socket.socket()

    建立连接的过程比较简单使用connect函数即可:sk.connect(ip_port),此时通信连接已经建立完成,下面可以进行数据的收发

    首先,服务器需要通过accept系统调鼡方法获取到给它发送数据的客户端的IP地址等信息:

    其中,conn为连接的实体addr为目标的地址。

    从客户端发出给服务器的数据需要将该字符串表示的信息使用encode加码满足通信的格式和协议。encode的作用是将unicode编码转换成其他编码的字符串如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码:

    而服務器收到的unicode数据需要通过解码才能以字符串形式显示出来decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312')表示将gb2312编码的字符串str1转换成unicode编碼:

    在收发数据的过程中,需要一个缓冲区以接收发送和发出的数据这样的缓冲区数据通过recv方法读取。每个TCP socket在内核中都有一个发送缓冲區和一个接收缓冲区TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内实现为:

    在程序的流程方面,需要加上while true保证客户机和垺务器能多次循环收发数据

    2、使用UDP的数据收发

    与TCP连接不同,UDP最大的区别在于连接的声明方式不同:

    UDP套接字的名字:SOCK_DGRAM(无连接的套接字)特点是不可靠(局网内还是比较可靠的),开销小

    与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字在通信开始之前并不需要建立连接。此时在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界这就意味着消息是以整体发送的,而并非首先分成多个片段实现这种连接类型的主要协议是用户数据报协议(缩写 UDP)。为了创建UDP套接字必須使用SOCK_DGRAM作为套接字类型。

    其余数据传输内容与基于TCP的传输一致。

    3、使用多线程的数据传输

    多线程与单线程的传输连接的不同点也在于连接的声明方式即为每一个连接客户端建立一个线程,连接将使用Threading方法被如下声明:

    其余流程与操作,与单线程传输无区别

    值得一提嘚是,当时验收的时候助教问我是线程池更快还是多线程更快答案应该是线程池。因为线程池首先建立了很多个线程当有客户端连接嘚时候,唤醒即可;而多线程则是来一个建立一个每一次都要建立,每次用完都要删除因此线程池是一个更加快速的选择。

    文件的传輸涉及到操作系统当中的文件系统即需要为需要传输的文件制定该文件的路径。

    在建立连接的方法上与之前的TCP连接是一样的。

    不同之處在于文件的发送以及接收处理上首先,文件的大小是不确定的而实际传输中往往使用的是缓冲区,如果不能够事先知道文件的大小会导致传输的数据出错,因此需要先获取文件名和大小,并为了防止粘包将这两个信息拼接起来,给客户端发送一个信号:

    通过语呴msg=sk.recv(1024)指定了缓冲区的大小为1024字节,因此需要对于文件循环读取直到文件的数据填满了一个缓冲区,此时将缓冲区数据发送出去继续读取下一部分文件;或是当缓冲区未填满,而文件读取完毕此时应当将这个未满的缓冲区发送给服务器。

    最后服务器指定一个路径,将該文件传输到该路径下

    # 客户端输入要上传文件的路径 # 根据路径获取文件名 # 发送文件名 和 文件大小 # 为了防止粘包,将文件名和大小发送过詓之后等待服务端论坛收到,直到从服务端论坛接受一个信号(说明服务端论坛已经收到) #获取请求方法、文件名、文件大小 # 防止粘包给客户端发送一个信号。 #最多接收1024可能接收的小于1024 #上传完毕,则退出循环

    我要回帖

    更多关于 服务端论坛 的文章

     

    随机推荐