tcp/ip协议是个族群。包含如下
- TCP
- UDP
- IP
- ARP:根据IP找MAC地址
- ICMP:PING 的时候用的协议
- RARP:根据MAC找IP地址
- IHMP
ISO七层网络模型
- 应用层:传输的数据
- 表示层
- 会话层
- 传输层:端口
- 网络层:ip地址
- 数据链路层:MAC地址
- 物理层:网卡
TCP和UDP区别
- 稳定:在TCP中,如果有一方收到了对方的数据,一定会发送ACK确认请包给发送方,如果没收到ACK就会继续发数据给请求方。而UDP中,没有这个过程。因此导致了TCP稳定,UDP不稳定。
- 相对于UDO而言,要慢一些。
- WEB服务器都是使用的TCP。
- TCP发送数据和接收数据使用send()和recv()。
- UDP发送数据和接收数据使用sendto() 和recbfrom()
TCP服务器操作步骤
- 创建套接字socket(xxx):相当于买一个手机
- 绑定ip地址和端口bind(xxx):插入手机卡
- 将默认的主动套接字变成被动套接字(可接收数据)listen(xxx):设置手机为响铃模式
- 准备接收accept(xx):等着别人的电话,准备好接听。
- recv/send接收发送数据
示例
from socket import *
#创建套接字
s = socket(AF_INET, SOCK_STREAM, 1)
#绑定服务器IP地址端口号,为空代表当前有几个网卡的所有IP地址
s.bind("",8080)
#转换可接收模式的套接字,#5表示可以同时最大可接收5个请求(liunx系统不受限)
s.listen(5)
#准备接收
client_socket, clientinfo = s.accept()
#client_socket 表示客户端的套接字。
#clieninfo 表示连接服务器的客户端IP和地址。
#接收数据
recvData = s.recv(1024) #可以接收1024个字节
print("%s:%s"%(str(clieninfo), recvData))
#使用完后,记得要关闭套接字
client_socket.close()
s.close()
TCP客户端操作步骤
- 创建套接字socket()
- 发送请求connect()
- recv/send接收发送数据
示例
from socket import *
#创建套接字
c = socket(AF_INET, SOCK_STREAM)
#发送请求
serAddr = ("192.168.1.254",8080) #服务器的IP地址
c.connect(serAddr)
#发送数据
c.send("haha".encode("utf-8"))
#接收数据
recvData = c.recv(1024)
print(recvData)
#关闭套接字
c.close()
三次握手
- 首先客户端发送给服务器一个SYN请求,(SYN请求里面包含一个序列号比如0)用来标识服务器是否收到请求,请求的内容就是SYN=0,如果服务器收到请求会在SYN加1 即0+1=1。
- 服务器收到请求,发送一个SYN+ACK。其中SYN是服务器发送给客户端的请求,用来确定客户端是否能收到,ACK就是用来确认收到客户端发来的请求即0+1=1。返回的内容就是SYN=0,ACK=1。
- 客户端收到服务器返回的请求,需要给服务器说一下我已收到,即发送内容为ACK=1,是在服务器发送过来的SYN的基础上+1。此时三次握手结束。
- 开始发送HTTP协议的数据请求。
- 服务器收到请求发送数据给客户端。
-
客户端发送确认收到数据请求给服务器。
四次挥手
- 客户端调用close()关闭套接字,发送FIN+ACK给服务器数据包。FIN就是用来告诉服务器我关闭了套接字。ACK用来确认上次收到的数据 (半连接)。
- 服务器收到请求,发送ACK数据包给客户端。
- 服务器紧接着发送FIN+ACK数据包给客户端,FIN告诉客户端我也关闭了套接字。ACK用来确认上次的请求收到了 (已连接)。
-
客户端发送ACK数据给服务器确认收到了。即四次挥手结束。
长连接、短连接
- 长连接:只需要一次三次握手。就可以一直保持连接。如,视频。
- 短连接:每次连接都需要三次握手,四次挥手。如,访问网页。