1.私网IP地址
私网 |
---|
10.0.0.0~10.255.255.255 | 172.16.0.0~172.31.255.255 | 192.168.0.0~192.168.255.255 |
2.常见端口
常见端口 | Telnet | ftp | http | smtp | dns | tftp | snmp |
---|
2^16=65536 | 23 | 20/21 | 80 | 25 | 53 | 69 | 161 |
netstat -ntulp |grep 8000:
netstat -app | grep 5000
lsof -i:8000
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
3.udp和tcp
1.简述TCP和UDP的区别以及优缺点?
协议 | TCP(Transmission Control Protocol) | UDP |
---|
1 | 协议面向连接的 | 面向无连接 | 2 | 基于字节流的 | 数据报文模式 | 3 | 安全可靠 | | 4 | TCP对系统资源要求较多 | UDP对系统资源要求较少 | 5 | 有序/去重/阻塞/流量控制 | |
2.tcp
三次握手
第一次握手:Client将标志位SYN置为1,随机产生一个值seq(sequence Number)=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN置为1,ACk=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为x+1,如果正确则将标志位ack=y+1,并将该数据包发送给Server,Server检查ACK是否为y+1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手
1客户端将FIN标为1,seq为x的报文给服务端,告诉服务器不在向他发送消息
2服务端收到信息后,回复ACK为y+1的报文给客户端告知确认断开连接
3服务端将FIN标为1,seq为y的报文给客户端端,告诉客户端不在向他发送消息
2客户端收到信息后,回复ACK为y+1的报文给服务端确认断开连接
4.TCP长连接/短连接应用场景
序号 | 长连接 | 短连接 |
---|
定义 | 一次连接n次读写 | n次连接n次读写 | 应用场景 | 数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误 | 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源 |
5.七层和四层协议
OSI:应,表,会,传.网,数,物
TCP:应 运,网,网络接口层
6.HTTP和HTTPS区别
协议 | http | https |
---|
1 | 超文本传输协议,信息是明文传输 | https 则是具有安全性的 ssl 加密传输协议 | 2 | 80 | 443 | 3 | | 需要ca证书 |
7.tcp的2MSL
主动发送FIN关闭的一方,在4次挥手最后一次要等待一段时间我们称这段时间为2MSL
TIME_WAIT状态的存在有两个理由:
1.让4次挥手关闭流程更加可靠
2.防止丢包后对后续新建的正常连接的传输造成破坏
8.为什么客户端在TIME-WAIT状态必须等待2MSL的时间
1、为了保证客户端发送的最后一个ACK报文段能够达到服务器。 这个ACK报文段可能丢失,因而使处在LAST-ACK状态的服务器收不到确认。服务器会超时重传FIN+ACK报文段,客户端就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重启计时器。最好,客户端和服务器都正常进入到CLOSED状态。如果客户端在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文后立即释放连接,那么就无法收到服务器重传的FIN+ACK报文段,因而也不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入CLOSED状态。
2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK确认报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段
9.GET和POST的区别
操作 | get | POST |
---|
点击返回/刷新按钮 | 没有影响 | 数据会重新发送 | 添加书签 | 可以 | 不可以 | 是否可以缓存 | 可以 | 不可以 | 历史记录 | 有 | | 长度限制 | 有 | 没有 | 数据类型限制 | 只允许ASCII字符类型 | 没有限制。 | 安全性 | 不要使用GET请求提交敏感数据 | 相比get而言Post的会更安全 |
10 套接字
定义:socket实现不同进程之间的通信利用ip地址,协议,端口,标识唯一的网络进程
参数 | 解释 |
---|
AddressFamily | AF_INET:((用于 Internet 进程间通信))/AF_UNIX((用于同一台机器进程间通信)) | Type | SOCK_STREAM(流式套接字,主要用于 TCP 协议)/SOCK_DGRAM(数据报套接字,主要用于 UDP 协议) |
1.udp
import socket
def send_msg(udp_socket):
dest_ip,dest_port = input("\n请输入对方的ip地址,port端口号:")
msg = input("\n请输入要发送的数据:")
udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
recv_data=s.recvfrom(1024)
recv_msg = recv_msg[0].decode("utf-8")
recv_ip = recv_msg[1]
print(">>>%s:%s" % (str(recv_ip), recv_msg))
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(("", 7890))
while True:
print("="*30)
op_num = input("请输入要操作的功能序号(1:发送消息2:接收消息):")
if op_num == "1":
send_msg(udp_socket)
elif op_num == "2":
recv_msg(udp_socket)
else:
print("输入有误,请重新输入...")
2.tcp
客户端:
import socket
tcp_client_socket=socket(AF_INIT,SOCKT_STRAEM)
server_ip,server_port=input("请输入服务器IP,服务器端口号:")
tcp_client_socket.connect((server_ip,server_port))
send_data=input("请输入要发送的数据:")
tcp_client_socket.send(send_data.encode("gbk"))
rcv_data=tcp_client_socket.recv(1024)
print('接收到的数据:'recvdata.decode('gbk'))
tcp_client_socket.close()
服务端:
import socket
tcp_server_socket=socket(AF_INET,SOCKET_STRAEM)
address=('',7788)
tcp_server_socket.bind(address)
tcp_server_socket.listen(128)
client_socket,clientAddr=tcp_server_socket.accept()
recv_data=client_socket.recv(1024)
print('接收到的数据:'recv_data.decode('gbk'))
client_socket.send("thank you!".encode('gbk'))
client_socket.close()
问题:
1.[WinError 10038] 在一个非套接字上尝试了一个操作
socket 先 close 再调 recv 就会报错。
解决方法:可以判断一下是否关闭了再操作:
if not tcpCliSock._closed:
|