Tcp的作用

TCP简介

1.引入

使用UDP发送数据容易丢失,而TCP能够保证数据稳定传送,所以更多时候用的是TCP,例如浏览器底层实现就是用的TCP
2.TCP介绍

TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的传输通信协议
3. TCP作用
通过TCP协议, 能够更加稳定的将数据传递到目的地
UDP

最明显的一点: 简单, 但不稳定
说明:

1. udp发送数据时, 只要明确对方的ip, port就能够直接把数据传递过来
2. 当接收方收到数据之后, 可以直接进行处理, 不需要告知发送方数据已收到

在这里插入图片描述

TCP

复杂, 但稳定

1. Tcp发送方首先要与tcp接收方之间建立连接(对方互相打招呼, 分配好资源等)
2. Tcp发送方发送数据时,只需要填写数据内容即可, 不需要再写目的ip,port等, 因为之间的"连接"已经做好了准备
3. Tcp接收方收到数据之后, 接收方的操作系统会自动回复一个"确实收到"的消息给发送方,这样做的目的是让发送方知道刚刚发送的数据对方已经成功地接收到
4. 当数据首发完毕, 双方再次互相打招呼, 将各自的资源释放

Tcp特点

1面向连接
通信双方必须先建立连接才能进行数据的传输,
因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
2.可靠传输
(1)Tcp采用"发送"-"应答"机制
P发送的每个数据都必须得到接收方的应答才认为这个TCP数据传输成功

(2)超时重传发送端发出一个数据之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个数据。

TCP为了保证不发生丢数据,就给每个数据一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的数据发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据就被假设为已丢失将会被进行重传。

(3)错误校验
TCP用校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

(4) 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP与UDP的不同点
  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

TCP客户端

1. 引入
为了区分,被服务的一方 和 提供服务的一方,网络中有客户端、服务器。TCP客户端的代码流程与TCP服务器的代码流程不一样,因此需要单独学习
2. 区分客户端、服务器

之前有一个段子:一个顾客去饭馆吃饭,这个顾客要点菜,就问服务员咱们饭店用客户端么,然后这个服务员非常客气的说道:先生 我们饭店不用客户端,我们直接送到您的餐桌上如果,不学习网络的知识 说不定也会发生那样的笑话 ,哈哈

客户端:

需要服务的一方,例如我们用浏览器上个,浏览器帮助我们向远程的一台电脑发送请求接收数据,以及展示效果等,此时浏览器就是客户端

服务器(端):

就是提供服务的一方,例如玩游戏时,需要登录的服务器

构建TCP客户端流程
试想玩在线游戏的时候的流程:
打开电脑
链接游戏服务器登录
玩游戏
退出游戏

TCP的客户端的实现过程很类似玩游戏的流程
逻辑顺序如下:

创建一个TCP套接字(套接字不区分客户端、服务器)
链接服务器
向服务器发送数据、接收来自服务器的响应数据断开链接

在这里插入图片描述

TCP客户端

from socket import *

# 1. 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 2. 链接服务器
tcp_client_socket.connect(("192.168.1.104", 8080))

# 提示用户输入数据
send_data = input("请输入要发送的数据:")

# 3. 向服务器发送数据
tcp_client_socket.send(send_data.encode("utf-8"))

# 4. 关闭套接字
tcp_client_socket.close()
发送-接收数据的
import socket 

# 1 创建套接字
client_s =  
socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2 连接服务器
client_s.connect(("192.168.1.104", 8080"))

#  3 获取要发送的数据
senf_content = input("请输入要发送的数据内容:")

# 4.1 发送数据
client_s.send(send_content.encode("utf_8"))

# 4.2 接收数据
recv_content = client_s.recv(1024)
print(recv_content.decode("utf-8"))

#  5 关闭套接字
client_s.close()
小总结

(-)TCP客户端的流程:
1.创建套接字
2.连接服务器
3.发送/接收数据
4.关闭套接字

(二)虽然在学习TCP通信的过程中说:当接收到数据后需要给对方发送确认信息, 但那时操作系统做的事情,咱们编写的代码不需要确认, 只管收发数据即可

TCP服务器
TCP服务器
为其他的TCP程序提供服务的程序, 称之为TCP服务器
构建TCP服务器流程

如果想让别人能打通我们的电话获取相应服务的话,我们需要做以下几件事情:

买个手机
插上手机卡
设计手机为正常接听状态(即能够响铃)
静静的等着别人拨打
然后听、说(即服务)
等待客户挂断电话后,自己也挂断电话

创建TCP服务器的代码流程如同上面的电话机过程一样,在程序中,如果想要完成一个TCP服务器的功能,需要的流程如下:

socket创建一个套接字
bind绑定ip和port
listen使套接字变为被动链接
accept等待客户端的链接
recv/send接收发送数据
close关闭套接字

TCP服务器示例3.1 接收1次数据(不推荐的做法

import socket
# 1. 创建TCP套接字
server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 绑定本地信息
server_s.bind(("", 7788))

# 3. 设置为被动的
server_s.listen(128)

# 4. 等待客户端链接
new_s,.client_info = server_s.accept()

# 5. 用新的套接字为已经连接好的客户端服务器
recv_content = new_s.recv(1024)
print("%s>>>%s" (str(client_info),recv_content.decode("gbk")))                     

# 6. 关闭套接字
new_s.close()
server_s.close()

接收多次数据(推挤做法)

import socket


# 1. 创建TCP套接字
server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 绑定本地信息
server_s.bind(("", 7788))

# 3. 设置为被动的
server_s.listen(128)

# 4. 等待客户端链接
new_s, client_info = server_s.accept()

# 5. 用新的套接字为已经连接好的客户端服务器
while True:
    recv_content = new_s.recv(1024)
    print("%s>>>%s" % (str(client_info), recv_content.decode("gbk")))

    if not recv_content:
        # 当客户端调用了close后,recv返回值为空,此时服务套接字就可以close了
        # 6. 关闭服务套接字
        new_s.close()
        break

# 7. 关闭监听套接字
server_s.close()
4.小总结

服务器端需要做的事情基本固定
1. 创建套接字
2. 绑定本地信息变为监听套接字(被动套接字)
3. 等待客户端链接,创建一个新的服务套接字
4. 用服务套接字为客户端服务
5. 等待客户端先关闭,然后再关闭套接字
TCP注意点

1.TCP服务器一般情况下都需要绑定, 否则客户端找不到这个服务器

  1. TCP客户端一般不用绑定, 因为是主动连接服务器,所以只要确定好服务器的ip,port等信息就好,本地客户端可以随机

3.TCP服务器中通过listen可以将socket创建出来的主动套机制变为被动的,这是做TCP服务器是必须要做的

4.当客户端需要连接服务器时,就需要使用connect进行连接,UDP是不需要连接的而是直接发生,但是TCP必须连接,只有连接成功才能通信

5.当一个TCP客户端连接服务器时,服务器会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户的服务

6.listen后的套接字是被动套接字,用来接收新的客户端的链接请求, 而accept返回的新套接字是标记这个新客户端的

7.关闭listen后的套接字意味着被动套接字关闭了, 会导致新的客户端不能够链接服务器, 但是之前已经连接成功的客户端正常通信

8.关闭listen后的套接字意味着这个客户端已经服务完毕

9.当客户端的套接字调用close后, 服务器端会recv解堵塞
并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

TCP 三次握手

调用connect()
SYN 请求连接
ACK 确认有效
在这里插入图片描述

TCP 四次挥手

执行close()
FIN 断开连接
在这里插入图片描述

TCP/IP协议族中各协议之间的关系

应用层 api
传输层 tcp port
网络层 ip 地址
链路层 mac地址

1.api
API(Application Programming Interface,[应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程]的能力,而又无需访问源码,或理解内部工作机制的细节。
2.mac
地址MAC(Media Access Control,介质访问控制)地址,也叫硬件地址,长度是48比特(6字节),由16进制的数字组成,分为前24位和后24位。用来确定你的设备

查看 ipconfig /all 物理地址

或者 选中网卡适配器 右键 然后状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLhHT3JD-1578534132839)(en-resource://database/473:1)]

3.1arp

  • 地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确地址解析协议定其物理地址的一种协议

  • arp广播:在A不知道B的MAC地址的情况下,A就广播一个ARP请求包,请求包中填有B的IP(192.168.1.2),和mac地址(ff ff ff ff ff ff)以太网中的所有计算机都会接收这个请求,而正常的情况下只有B会给出ARP应答包,包中就填充上了B的MAC地址,并回复给A。

  • A得到ARP应答后,将B的MAC地址放入本机缓存,便于下次使用。本机MAC缓存是有生存期的,生存期结束后,将再次重复上面的过程。

  • 抓包工具 arp

  • arp -a命令 查看当前电脑所缓存的mac地址和ip地址对应表

  • arp攻击 伪造信息 告诉错误的mac地址
    3.数据创输过程
    在这里插入图片描述

3.3DHCP
动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址;给用户用于内部网管理员作为对所有计算机作中央管理的手段。

设置ip
sudo ifconfig ens40 192.168.15.222

集线器 交换机 路由器
2台电脑 一根网线就可以传东西了

3台呢 从中间剪开? 不可以 数据信号不能 这样 需要集线器 hub 就像udb扩展口一样

缺点 都是广播

交换机 会记住mac地址

路由器 可以多个网络之间联通 路由器上有很多个网卡

网关就是一个ip地址 可以起到转发作用

访问百度的过程
在浏览器中输入www.baidu.com时,到底做了什么?

1.需要知道www.baidu.com的ip,但是不知道,

2.需要通过dns来解析出 www.baidu.com对应的ip,但是不知道网关的mac地址

3.真的情况是 先发送arp广播,得到默认网关的mac地址,

4.然后向dns服务器发送查询 www.baidu.com对应的ip的请求

5.假如 dns服务器找到了 www.baidu.com对应的ip,那么就会将这个ip地址返回到 请求方

6.到现在为止,咱们的电脑才知道了 www.baidu.com对应的ip

7.接下来会通过tcp的3次握手,

8.链接http服务器链接成功后,会发送真正的http请求,来得到www.baidu.com的主页内容

9.http服务器接收到请求后,组织主页的内容数据,将其返回到这个 请求方的电脑上

10.电脑接收到http的数据应答后,传递给浏览器,浏览器负责将其进行显示

子网掩码
把ip地址和子网掩码进行 按位与计算 得到的如果是同一个值 就说明在同一个网内

192.168.15.46 192.168.15.93
255.255.255.0
10110111
11111111 11111111 1111111100000000
192.168.15.0 192.168.15.0

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值