TCP通信详解

一、TCP简介

  1.TCP介绍

    a>TCP协议:TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为:TCP)是一种面向连接的、可靠的、基于字节流的通信协议

    1.面向连接:先连接,再通信,好比打电话模型

    2.可靠的,相对于UDP,TCP传输更可靠,TCP通过一序列的机制(面向连接机制、发送应答机制)来保障传输的可靠性

    3.基于字节流的,UDP创建UDP socket——DGRAM:基于数据报通信方式,每一次发送的数据都是一个独立的整体,包含目标主机的ip地址、端口号及发送数据的内容

    b>TCP通信的三个步骤

    基于面向连接的:1.与服务端建立连接

            2.收发数据

            3.关闭连接

  2.TCP特点

    a>面向连接

    1.先建立连接,再进行通信

    2.TCP连接是一对一的,而UDP可以一对一或一对多,UDP适合做广播程序

    a>可靠传输:通过一序列机制来保障TCP传输数据比UDP更可靠

    1.传送应答机制

    2.超时重传机制

    3.错误校验

    4.流量控制/阻塞管理

  3.TCP与UDP的不同点

    1.面向连接

    2.有序数据传输

    3.重发丢失的数据包

    4.丢弃重复的数据包

    5.无差错的数据传输

    6.阻塞/流量控制

  4.TCP与UDP的应用场景

    1.TCP的应用场景:适合通信质量要求较高的场景,http传输、文件传输、smtp等等,目前大部分的传输都是基于TCP协议传输

    2.UDP的应用场景:相对于TCP传输,UDP传输速度更快,实时性更好,耗资源更少,但稳定性、可靠性比TCP差,适合对网络通讯质量要求不高,速度要求尽量快,更实时,比如QQ语音,QQ视频

  5.UDP与TCP的通信模型

    a>UDP通信模型

      面向无连接,好比写信模型,没有严格的服务端与客户端之分

    b>TCP通信模型

      面向连接的,好比打电话模型,有严格的服务端与客户端之分

二、TCP网络程序-客户端(重点)

  1、TCP客户端实现流程

    1、创建一个TCP的socket对象

    2、与TCP服务端建立连接

    3、使用TCP socket 收发数据

    4、关闭连接

  参考代码如下:

          

                                    

三、TCP网络程序-服务端(重点)

  1.TCP服务端创建流程:

    1、创建服务端的server_socket,用于监听客户端的请求

    2、绑定端口

    3、server_socket开启监听,有主动连接改变为被动连接模式

    4、假如有客户端的请求,则立即接收,且创建一个与客户端对接的socket,与客户端进行通信

    5、使用新创建的socket与客户端通信

    6、关闭与客户端通信的socket,当该socket被关闭,则不再与当前客户端通信

    7、关闭用于监听客户端发送请求的socket,当该socket关闭,则不再接收新的客户端请求

  参考代码如下:

         

           

 

   2、同时为多个客户端提供服务:

        参考代码如下:

                              

                              

  4、为同一个客户端提供多次服务

    参考代码如下:

        

        

        

 

四、TCP注意点:

  

tcp服务端一般情况下都需要绑定,否则客户端找不到这个服务端
tcp客户端一般不绑定,因为是主动连接服务端,所以只要确定好服务端的ip、port等信息就好,本地客户端可以随机
tcp服务端中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务端时必须要做的
当客户端需要连接服务端时,就需要使用connect进行连接,udp是不需要连接的而是直接发送,但是tcp必须先连接,只有连接成功才能通信
当一个tcp客户端连接服务端时,服务端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
listen后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept返回的新套接字是标记这个新客户端的
关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够连接服务端,但是之前已经连接成功的客户端正常通信。
关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务端会recv解堵塞,并且返回的长度为0,因此服务端可以通过返回数据的长度来区别客户端是否已经下线


五、三次握手、四次挥手(了解)

a> 三次握手
第一次握手: 客户端A向服务端B发送连接请求(客户端-->服务端方向)
第二次握手: 服务端B向客户端A发送确认连接,同时向客户端A发送连接请求(服务端-->客户端方向)
第三次握手: 客户端A收到服务端的确认信息,正确无误后,再向客户端发送确认连接信息(客户端-->服务端方向)

b> 四次挥手

六、 服务器如何复用同一个端口而不会提示端口被占用
"""
socket.setsockopt(level,option,value) :配置socket
level:等级,对哪个等级操作(ip,tcp,udp,socket等级)
option:设置哪个选项
socket.SO_REUSEADDR: 复用地址
value: True:表示复用,False,表示不复用
"""
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 提示:socket.setsockopt()方法要在 socket.bind()之前设置

   

 七、案列:文件下载器

  a>客户端实现:

    “”“文件下载器客户端实现流程

       1、创建一个TCP socket

       2、连接服务端

       3、获取用户输入的文件名

          4、把要下载的文件名发给服务端

          5、等待接收服务端回传的文件内容

        6、假如内容不为空,则写入到文件中

        7、关闭TCP socket

    ”“”

    参考代码如下:

           

           

  b>服务端实现

    

""" 文件下载服务端实现流程
1. 创建服务端的socket,用来做监听的
2. 绑定端口
3. 开启监听 listen
4. 循环接收客户端的下载请求
5. 获取客户端发送过来的要下载的文件名
6. 通过函数取得要下载的文件的内容
7. 把内容回传给客户端
8. 关闭与客户端对接的socket
9. 关闭服务端server_socket,不再接收新的下载文件的请求
"""

参考代码如下:

      

      

      

 

    

 

 

 

 

 

posted @ 2019-02-24 14:52  宠辱不惊666  阅读(7492)  评论(0编辑  收藏  举报