TCP/IP协议和HTTP协议
一、TCP/IP协议结构
(1)应用层:应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的。对于不同种类的应用程序会根据需求使用应用层不同的协议,如邮件传输应用使用了SMTP协议、万维网使用了HTTP协议。
(2)运输层:作为TCP/IP协议的第二层,运输层在整个TCP/IP协议中起到了中流砥柱的作用。
(3)网络层:位于TCP/IP协议的第三层,可以进行网络连接的建立和终止以及IP地址的寻找等功能。
(4)网络接口层:最后一层,即第四层,是传输数据的物理媒介,可以为网络层提供一条准确无误的线路。
二、IP协议、TCP协议、UDP协议
- ip协议就是将数据分割成一小块一小块,再将数据通过ip包发送出去,从一台计算机通过网络发送到另一台计算机,ip包的特点是不保证到达,也不保证顺序到达。
- tcp协议则是建立在ip协议的基础之上的。tcp协议负责通过握手的方式在两台计算机之间建立可靠的连接,保证数据包都能到达,同时tcp协议会对每个ip包进行编号,以保证数据顺序到达,若是包丢掉了,就会自动重发。
- udp协议是一个无连接的协议,传输数据之前源端和终端不会建立连接,只需要知道对方的IP地址和端口号,就可以直接发送数据包,因此udp传输的速度非常快。
三、TCP协议与UDP协议的区别
- TCP是面向连接的,UDP面向无连接的。
- TCP将数据以流的形式发送,UPD则是以报文的形式发送。
- TCP时可靠的,UDP是不可靠的。
- TCP能保证数据按顺序全部到达,UDP不能保证数据全部到达也不能保证数据按顺序到达。
- TCP的效率比UDP效率低。
- TCP通常用于对于数据准确性较高的一些网络程序比如:短信,邮箱,文件传输,
UDP通常用于对数据准确性要求低,但是对速度要求高,比如:网络电话,视频等。
四、三次握手与四次挥手
-
三次握手:
1.第一次握手:客户端发送一个带有syn(同步序列编号)包到服务器,进入SYN_SEND状态,并等待服务器确认。
2.第二次握手:服务器接收到syn包,确认客户的syn,同时发送一个syn包和ack确认信息到客户端,并进入SYN_RECV状态。
3.第三次握手:客户端收到服务器的syn包和ack确认信息,向服务器发送ack确认信息,完成三次握手,此时客户端和服务器进入ESTABLISHED(TCP连接成功)状态。
-
四次挥手:
1.第一次挥手:客户端发送一个fin(释放信息)给服务器,用来关闭客户端和服务器之间的数据传输。
2.第二次挥手:服务器收到fin后,给客户端发送一个ack确认信息。
3.第三次挥手:服务器将最后的数据传输完后,向客户端发送fin和ack确认信息,关闭连接。
4.第四次挥手:客户端收到fin后,向服务器发送一个ack确认信息,完成四次握手。
五、代码实现TCP/UDP客户端和服务器
-
TCP服务器的实现
import socket ''' 参数一:指定IP协议使用IP4 参数二:指定TCP协议 ''' s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定ip地址以及端口号以元祖的形式 s.bind(('10.36.143.26', 10086)) # 设置最大监听个数 s.listen(15) while True: # 等待客户端连接 # 获取创建好的sock,以及对方的地址 sock, address = s.accept() print(sock.recv(1024)) sock.send("欢迎访问".encode("gbk"))
-
TCP客户端的实现
import socket # 创建socket对象 sock = socket.socket() # 建立连接 sock.connect(('10.36.143.26', 10086)) # 发送数据 sock.send(b"haha") # 接收数据 print(s.recv(1024).decode("gbk"))
-
UDP服务器的实现
import socket ''' 1.导包:import socket 2.创建socket对象 3.绑定ip地址以及端口号 bind(address) 4.等待客户端连接 recvfrom(size) 返回一个data与address 5.发送数据到客户端 sendto(data,address) 6.关闭socket,一般处于常开的状态 ''' ''' 参数一:指定ip协议 参数二:指定UDP协议 ''' sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定address(ip地址, 端口号) sock.bind(('10.36.143.26', 10086)) while True: # 接收数据 data, address = sock.recvform(1024*1000) print(data.decode("utf-8")) sock.sendto("收到".encode("utf-8"), address)
-
UDP客服端的实现
''' 1.导包:import socket 2.创建socket对象 3.接收服务器发送的信息 recv(size) 4.关闭socket,close() ''' import socket # 创建socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 发送数据到指定地址 sock.sendto(b"hello", ('10.36.143.27', 9581)) # 接收服务器返回的数据 data = sock.recv(1024) print(data.decode("utf-8")) # 关闭连接 sock.close()
六、HTTP协议
-
概念
互联网在传输数据的时候需要遵循一定的规范格式,其中我们在使用浏览器浏览网页的时候就需要遵循http协议,中文名称超文本传输协议。http协议主要用来传输超文本、网页等数据。类似的协议还有ftp(主要用来传输文件)。
我们需要采集指定计算机的数据,那么我们怎么才能找到这台计算机呢?
http协议使用url来定位计算机和计算机中的数据资源。例如https://blog.csdn.net/weixin_44368274/article/details/106080502就是一个url,在浏览器上输入这串字符就能找到我的这篇博客了。https表示协议的名称,https是http协议的加密版本。blog.csdn.net表示服务器的域名,通过转换可以变成ip地址,可以通过域名在茫茫互联网上定位到csdn的服务器。最后通过后面的参数/weixin_44368274/article/details/106080502找到该服务器web站点下的资源。 -
常见的状态码及意义:
200:请求成功
301:资源被永久转移到其他url
403:服务器收到请求,但拒绝服务
404:请求资源(网页)不存在
500:内部服务器错误 -
get和post请求的区别
1.get用于获取数据,提交参数在url后面,可见,有长度限制,不安全。
2.post用于提交数据,提交参数和数据在http body中,不可见,无限制,安全。 -
从浏览器上输入https://www.qq.com到浏览器上查看网页,背后发生什么,涉及什么网络协议。
1.先在本地的hosts文件中查找有无这个域名的映射,有则调用这个ip地址,若无则查找本地的DNS服务器,完成域名解析。
2.浏览器根据解析得到的ip地址向web服务器发送一个http请求。
3.服务器收到请求进行处理并返回http响应。
4.浏览器收到响应进行解析,渲染显示。
5.页面显示完成后,浏览器发送异步请求。
-
http请求格式
请求行、请求头、请求体
1.请求行
协议的版本:HTTP/1.1
请求的方式:GET/POST/PUT/DELETE
请求的路径:/2.请求头(key,value形式)
User-Agent:产生请求的浏览器类型
请求服务器的地址:HOST:主机地址
cookie信息3.请求数据
如果是get请求,为空
如果是post请求,会吧数据以key value形式发送请求:name=‘laowang’ & age=20
如果是put和delete请求,格式是json字符串:{“name”:“laowang”, “age”:20}4.空行
发送回车符和换行符,通知服务器以下不再有请求头 -
http响应格式
1.响应行
版本协议:HTTP/1.1
状态码:200 ok2.响应头
服务器类型
返回内容的格式
网页:content-type:text/html;charset=utf-8
json数据:content-type: application/json
图片:content-type: image/jpg3.响应报文(数据)
服务器返回的HTML页面