网络基础知识及tcp udp的区别和连接过程
网络: 将俩台主机连接起来
互联网 将各个网络连接起来 (路由器) 最大的互联网 Inter
互联网中通讯的主角: 运行在不同主机上的俩个进程
如何在网络标识进程: IP地址 + 端口号
IP地址:标识网络中主机的地址
端口号:标示主机上的进程的PID
网络设备:
交换机
路由器(选路 存储 转发)
路由表 IP地址指定的网络对应的接口
网线: 双绞线 同轴电缆 光纤 (光传输 )
七层协议模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
Tcp/ip 四层协议模型
应用层 HTTP HTTPS DNS FTP PING
传输层 TCP UDP
网络层 IP ICMP
数据链路层 ARP RARP
物理层
TCP:面向连接的,可靠的,字节流服务。
Tcp 报头中的控制信息 保证 tcp可靠性传输
Tcp的面向连接
- 俩端通讯之前,必须先建立连接
- 连接一旦建立,俩端交互过程都在这一连接上完成,无需重新建立连接,直到关闭连接为止
- 通讯完成后,需要断开连接,释放服务器的资源
- 操作系统为我们维护连接,所以内核需要为连接分配相应的资源
- 对于服务器而言,一个连接只能为一个客户端维护,从而造成服务器性能有待优化。
拥塞控制:
- 慢启动
- 拥塞避免
- 快重传
- 快恢复
快重传: 发送方连续收到三个相同的确认报文段,此刻,网络拥塞
- 将丢失的报文段立即重传,无需等待超时时间到达
- 将慢启动门限设置为原来的一半,重新开始慢启动
快速恢复: 发送方连续收到三个相同的确认报文段,此刻,网络拥塞
1.将丢失的报文段立即重传,无需等待超时时间到达
2 .将慢启动门限设置为原来的一半,重新开始拥塞避免。
TCP 服务器编程流程
Int listenfd =socket(); //将ipv4协议和tcp协议绑定,给外部提供连接,=通道 门迎
Bind(); //将服务器的IP地址+端口号与listenfd 绑定
listen(listenfd ,size); //内核启动监听,接受客户端监听 不会阻塞
Int c =accept(); // 获取一个连接完成的客户端,具体与服务器连接上的客户端。
服务于C:
recv(); //接受数据
send(); //发送数据
close(c); //断开连接
Close(listenfd);
TCP 客户端编程流程
Bind() //可选 如果没有绑定 内核也会自动选择有个可用端口,自动探测本地的IP地址
Int sockfd= socket();
connect(); //有阻塞的,但是三次握手的速度快,感受不到
send();
recv()
close()
Tcp建立连接过程 三次握手:
Tcp断开连接过程->四次挥手
UDP:无连接的,不可靠的,数据报服务。
udp编程流程
服务器:被动通讯方
Int sockfd= socket();
bind(); //将服务器的IP地址、端口号与sockfd、绑定
recvfrom(); // 必须接受对端地址信息
sento ();
close(sockfd) //关闭服务器
客户端:主动通讯方
Int sockfd= socket();
bind(); //将服务器的IP地址、端口号与sockfd、绑定
sendto ();
recvfrom(); //可以不接受对端信息
close(sockfd) //关闭客户端
Int recvfrom(int sockfd,void *buff,int len,int flags , struct )
Tcp/udp:
字节流服务:
- 发送方send的次数和接收方recv的次数没有必然联系
- 如果发送方发送一次数据,接收方一次未接受完,不会丢失
数据报服务:
- sendto服务的次数和recvfrom次数相等
-
如果recvfrom一次未接受完,剩余的数据会丢弃
传送数据的可靠性 - 数据能否到达对端 32位确认号,超时重传,滑动窗口(流量管控),拥塞控制
- 数据到达对端是否有序 32位序号 不乱序
-
数据是否被修改(失真) 16位冗余检验 CRC算法完成校验