网络协议TCP

TCP:传输控制协议

tcp的特点:面向连接(打电话模型),可靠传输

tcp通信的三个步骤:

  1.通信双方建立连接

  2.收发收据

  3.关闭连接

tcp客户端实现流程

"""TCP客户端实现流程
1. 创建一个tcp 客户端对象
2. 与服务端建立连接
3. 通过tcp socket 收发数据
4. 关闭连接
   关闭udp
"""
import socket


def main():
    #1. 创建一个tcp 客户端对象
    tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 2. 与服务端建立连接
    # the address is a pair (host, port) # 元组 第一个元素是tcp服务端ip ,第二个元素是服务端的端口
    server_addr=('192.168.44.79',8080)
    tcp_client_socket.connect(server_addr)  #连接服务器connect

    # 3. 通过tcp socket 收发数据
    #3.1 发送数据到服务端
    send_data=input("请输入您要发送的数据:")
    tcp_client_socket.send(send_data.encode()) # 在linux中默认是utf-8编码
    
    # 3.2 等待接收从服务端回传的消息
    # (b'xc4xe3xd2xb2xbaxc3', None)
    # recv_data=tcp_client_socket.recvfrom(1024) # 每次最多接收1024字节

    # b'good'
    recv_data=tcp_client_socket.recv(1024) # 每次最多接收1024字节

    # 把字节串转为字符串   解码
    data=recv_data.decode('gbk')

    print("接收到的数据:",data)

    # 4. 关闭连接
    tcp_client_socket.close()


if __name__ == '__main__':
    main() # alt+enter 快速修复

tcp服务端流程

"""tcp服务端创建流程
1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
2. 绑定端口
3. server_socket开启监听,由主动连接模式变为被动接受模式
4. 等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
5. 使用新创建的socket与客户端通信
6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
7. server_socket关闭,则不再接收新的客户端请求
"""
import socket


def main():
    #1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
    server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 复用同一个端口而不会提示端口被占用 ,解决当关闭的socket当处于time_out状态时, 也可立即使用端口
    """
        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()之前设置

    #2.绑定端口
    server_socket.bind(('',9999))

    #3. server_socket开启监听,由主动连接模式变为被动接受模式
    server_socket.listen(5)  # backlog 积压未办之事,好比排队队列,用于设置排队队列排队人数的最大值

    #4.等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
    # new_sock: 新创建的socket,用该socket与客户端通信
    # client_addr :客户端的地址

    # 为多个客户端提供服务
    while True:
        new_sock, client_addr=server_socket.accept()
        print("有新的客户端请求,来自-->",client_addr)

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

        # 为同一客户端提供多次服务
        while True:
            # 5.1 接收客户端的请求数据
            # 当客户端的socket调用了close后,则会向服务端发送0长度的信息,且服务端解阻塞
            recv_data=new_sock.recv(1024)

            if recv_data:
                print("接收到的数据:",recv_data.decode('gbk'))

                #5.2 回复数据给客户端
                new_sock.send("欢迎光临".encode())
            else:
                print("客户端已经下线...")
                break

        # 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
        new_sock.close()

    # 7.server_socket关闭,则不再接收新的客户端请求
    server_socket.close()


if __name__ == '__main__':
    main()

小结:TCP与UDP的不同点:

    1.面向连接

    2.有序数据传输

    3.重发丢失的数据包

    4.舍弃重复的数据包

    5.无差错的数据传输

    6.阻塞/流量控制

TCP的三次握手与四次挥手

 

原文地址:https://www.cnblogs.com/xiaolu915/p/10511024.html