TCP协议-socket通信

TCP协议和UDP协议都属于端口协议,属于传输层

TCP协议 : 可靠的,面向连接,流式协议,安全,效率低     转账,文件传输....

UDP协议 : 快速,效率高,不可靠              微信,qq等聊天软件.....

TCP协议建立连接三次握手,断开连接四次挥手

三次握手:

客户端        --------------发送syn = 1 seq = 233432(随机序列号)请求建立链接----------->                       服务端
客户端      <----------发送 ack = 1 + 233432回应,且同时发送 syn = 1 seq = 68578请求建立链接---      服务端
客户端       ------------------发送ack = 1 + 68578回应,建立链接------------------------>                                服务端

总共建立两个通道

syn洪水攻击:一个服务器接收的客户端请求非常多

TCP协议又称好人协议,有一些黑客,造大量的假ip,发送请求,首先真的ip进不去,然后服务端处理大量的假ip,服务端会定时发送请求,与假ip建立链接,服务端容易崩

四次挥手:

客户端            ---发送fin = 1 seq = 34562 请求断开链接---------->               服务端
客户端            <----------回应ack = 1 + 34562 断开链接---------                    服务端
客户端           <----------发送fin = 1 seq = 67929请求断开链接----                服务端
客户端            -------- 回应ack = 1 + 67929 断开链接----------->                    服务端

注释:客户端给服务端发送完所有数据后,就会马上发送fin请求,关闭客户端到服务端的通道,但是此时服务端到客户端的数据还没有发送完毕,所有需要等到服务端将所有返回给客户端之后,服务端再发送fin数据,关闭另一个通道

套接字socket

python中的socket是一个模块,与网络通信相关的模块            在应用层和传输层中间 是socket抽象层

基于socket进行简单通信

# 服务端:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# socket.AF_INET   基于网络的socket       socket.SOCK_STREAM:基于TCP协议的socket
phone.bind(('192.168.16.197',8848))
# 绑定ip地址和端口     '127.0.0.1'是本地回环地址,只允许本计算机访问,当服务端和客户端都在一个计算机上时,可以使用这个ip
# 端口号范围在8000--65535
phone.listen(5)       #监听
# 服务端可以接收N个链接,但是只能同一时刻回应5个请求
conn,addr = phone.accept()    # 等待电话   阻塞等待
# conn = 管道
# addr = 地址
from_client_date = conn.recv(1024)     # 每次最多接收1024个字节
print(from_client_date)
conn.send(from_client_date.upper())
conn.close()
phone.close()



# 客户端:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   # 括号内参数可以不写,默认
phone.connect(('192.168.16.69',8888))
msg = input('>>>')
phone.send(msg.encode('utf-8'))   #发送字节
from_server_date = phone.recv(1024)
print(from_server_date)
phone.close()

基于socket的通信循环

# 服务端:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('192.168.16.197',8848))
phone.listen(5)     
conn,addr = phone.accept()    
while 1:
    from_client_date = conn.recv(1024)   
    print(from_client_date)
    conn.send(from_client_date.upper())
conn.close()
phone.close()


# 客户端:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   
phone.connect(('192.168.16.69',8888))
while 1:
    msg = input('>>>')
    phone.send(msg.encode('utf-8'))   
    from_server_date = phone.recv(1024)
    print(from_server_date)
phone.close()

基于socket的连接循环

# 服务端:
import socket
server = socket.socket()
server.bind(('127.0.0.1',9045))
server.listen(5)
while 1:
    conn,addr = server.accept()
    while 1:
        try:
            from_client_date = conn.recv(1024)
            print(from_client_date.decode('utf-8'))
            content = input('>>>')
            conn.send(content.encode('utf-8'))
        except Exception:
            break
    conn.close()
server.close()


# 客户端:
import socket
client = socket.socket()
client.connect(('192.168.16.69',8888))
while 1:
    msg = input('>>>')
    if msg.upper() == 'Q':
        break
    client.send(msg.encode('utf-8'))
    from_server_date = client.recv(1024)
    print(from_server_date.decode('utf-8'))
client.close()
原文地址:https://www.cnblogs.com/sandy-123/p/10408513.html