目录
一、.ip地址
在我们进行网络通信的过程中,经常需要发送信息到另一个客户端当中,这时候我们要怎么确定信息是发给了想要发送的目标呢。打个比方,我们使用qq发送信息,经常是点击目标头像打开聊天框输入信息发送,但是如果qq上有两个人信息头像等各种资料都一样,那系统是怎么判断这两个人的身份,这时候就是通过ip地址。
我们可以通过命令行来查看ip,windows下操作为:ifconfig
linux 下操作为:ipconfig
其中ip地址分为网络号和主机号,其中分为四种情况如下:
目的:用来标记网络上的一台电脑
标准形式:xxx.xxx.xx.xx
A类:第一组为网络号,后三组为主机号
B类:前两组为网络号,后两组为主机号
C类:前三组为网络号,最后一组为主机号
D类:全都为网络号,用于广播
二、端口
端口类似于ip地址,用来标记一个服务器、app等。
分为两类:知名端口:端口号为0~1023,不能随意使用
动态端口:端口号为1024~65535,可以随意使用
三、socket简介
socket翻译过来就是套接字,基本上市面上每个流传的可以通信的app都使用了socket,运用socket可以创建tcp、udp套接字
进行网络通信。
四、udp与tcp
udp和tcp都是用于网络通信的协议
udp:全称为用户数据报协议,他是一种快速通信的协议,不需要通过三次握手来建立连接。它是一种基于非连接的通信方式在传输过程中它不需要确定对方能否收到,类似于现代通信的信件通信,在送信的过程中我们只需要知道对方的地址,但并不能确定信件传输的过程中对方能否收到。是一种不安全不稳定的通信方式,常用于在传输过程中对于少量丢包可以忽视的情况,例如隧道通信,我们常见的vpn就是隧道通信的一种。
tcp:全称为传输控制协议, 他是基于连接的通信方式,需要通过三次握手以及四次挥手连接或断开连接。它用传输速度相对降低的代价换取了安全的通信环境。他的传输方式可以用现在的电话通信来解释,在通信的过程中我们发起通过,只有等对面接通了电话我们才能讲话。
五、利用代码写出简易的tcp聊天器
1.tcp作为客户端连接服务器
import socket def tcp_socket(): # 1.创建tcp套接字 tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.连接服务器 tcp.connect(('192.168.43.53', 8080)) # 3.发送数据 send_data = input("请输入你要发送的数据:") tcp.send(send_data.encode('utf-8'), ) # 4.关闭套接字 tcp.close() if __name__=='__main__': tcp_socket()
2.tcp作为服务器等待客户端连接
import socket
def main():
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定ip
tcp_socket.bind(('', 7788))
# 连接服务器
tcp_socket.listen(128)
# 等待客户端连接
client, address = tcp_socket.accept()
# 接收数据
recv_data = client.recvfrom(1024)
recv_msg = recv_data[0]
print("%s:%s" % (address, recv_msg.decode('utf-8')))
# 发送数据
send_data = input("请输入你要发送的内容:")
client.send(send_data.encode('utf-8'))
# 关闭套接字
client.close()
tcp_socket.close()
if __name__=='__main__':
main()
六、TCP的三次握手以及四次挥手
在网络传输的过程中,TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计了一种三次握手连接、四次握手断开连接的通信方式。
三次握手:服务端新建套接字,绑定地址信息后开始监听,进入LISTEN状态。客户端新建套接字绑定地址信息后调用connect,发送连接请求SYN,并进入SYN_SENT状态,等待服务器的确认。服务端一旦监听到连接请求,就会将连接放入内核等待队列中,并向客户端发送SYN和确认报文段ACK,进入SYN_RECD状态。客户端收到SYN+ACK报文后向服务端发送确认报文段ACK,并进入ESTABLISHED状态,开始读写数据。服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,就可以进行读写数据了
四次挥手:客户端主动调用close时,向服务端发送结束报文段FIN报,同时进入FIN_WAIT1状态;服务器会收到结束报文段FIN报,服务器返回确认报文段ACK并进入CLOSE_WAIT状态,此时如果服务端有数据要发送的话,客户端依然需要接收。客户端收到服务器对结束报文段的确认,就会进入到FIN_WAIT2状态,开始等待服务器的结束报文段;服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段FIN包,此时服务器进入LAST_ACK状态,等待最后一个ACK的带来;客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出送确认报文段ACK;服务器收到了对结束报文段确认的ACK,进入CLOSED状态,断开连接。而客户端要等待2MSL的时间,才会进入到CLOSED状态