网络原理之TCP/UDP IP

1 TCP/IP协议五元组:源ip+源端口号+目的ip+目的端口+协议号
windows 查看某个端口: netstat -ano|findstr “想要查看的端口号”.会显示某个进程的pid, 也可以查看 TCP连接的命令.
linux 查看端口: netstat -anp|grep “端口号” ,显示pid.
端口号本质上是用来表示应用程序的.应用程序发送数据都是发送到端口号上.
TCP/UDP协议头包括:(源端口+目的端口+长度+校验和+数据)

2 UDP:
(1) 无连接:知道 对端ip和端口号就直接发送,不需要建立连接.
(2) 不可靠:没有确认机制,没有重传机制,如果因为网络故障该段无法发送到对方,UDP协议层不会给应用层返回任何错误信息.
(3) 面向 数据报: 不能 灵活控制读写数据的次数和数量.
(4) 具有 接受缓冲区, 没有 发送缓冲区.
(5) 数据大小受限: 不能超过64k.

3 TCP: 为什么TCP这么复杂? 因为要 保证可靠性 (确认应答机制), 同时要 尽可能的提高性能 (效率相关机制).
(1) 有连接.
(2) 可靠性: 校验和,按序到达,确认应答,超时重发,流量控制等
(3) 面向 字节流.
(4) 有 发送缓冲区 和 接收缓冲区 保存数据. 缓冲区大小在2K~210K.
(5) 提高性能: 滑动窗口,快速重传,延迟应答,捎带应答.

TCP和UDP都有接收缓冲区.
TCP接收缓冲区不可能溢出, 因为TCP具有流量控制. 然而对于TCP来说, 当接收到的数据报装不进套接口接收缓冲区时, 该数据报就丢弃.
UDP是没有流量控制的. 较快的发送端可以很容易 淹没较慢的接收端, 导致接收端的UDP丢弃数据报.

TCP 和 UDP 区别.
(1) TCP 有连接, UDP 无连接.
(2) TCP 可靠, UDP 不可靠.
(3) TCP面向 字节流, UDP面向 数据报.
(4) 从效率上看, UDP效率更高.
(5) 每一条TCP连接只能是 点到点 的, UDP支持 一对一, 一对多, 多对一和多对多 的交互通信.

4 TCP怎么实现可靠传输?
(1) 确认应答机制: 发送的数据包携带序号, 响应的数据包携带 相应的确认序号. 因此发送端可知道 哪些数据接收到了, 哪些数据没有接收到.

(2) 超时重传机制: (1) 超过一定时间没收到, 表示数据包丢失需要重发----依赖发送缓冲区重发(系统内存中有进程基于TCP的发送缓冲区,系统可以重发) (2) 超时时间确定: 在固定的网络情况下,单次数据包发送的 最大时间 比较固定,有2次数据包(发送的+响应的),总的时间应该就是单次最大时间×2,单次数据传输的最大时间,在不同网络情况下会动态变化.
发送缓冲区: 数据超时没发送完, 会在缓冲区里保存一部分, 下次重发就会 先发送缓冲区 里面的数据.
接收缓冲区: 当x和y按序到达,但尚未被接收应用程序读取的数据. 或者x和y, 没有按序到达,y先到,x后到. 这时y会在接收缓冲区,然后等x先发送过来再重发.

(3) 连接管理机制:
(三次握手) 发送 SYN, 响应 ACK.
过程: (客户端到服务端建立连接. 每一端 保存自己的连接状态,自己发送SYN建立连接数据包,接受ACK响应数据包后,才会建立好连接).
客户端A. 服务端B.
(1) A发送SYN包(syn = j)到B, 并进入SYN_SEND状态, 等待B确认;
(2) B收到SYN包, 必须确认A的SYN包(ack = j+1), 同时自己也发送一个SYN包(syn = k), 即 SYN+ACK包, 此时服务器进入SYN_RECV状态;
(3) A收到B的SYN+ACK包, 向服务器发送确认包ACK(ack=k+1). 此包发送完毕, 客户端和服务器进入ESTABLISHED状态, 完成三次握手, 客户端与服务器开始传送数据.
在这里插入图片描述
(四次挥手) 发送 FIN, 响应 ACK.
主动关闭 的一方有 FIN_WAIT_1 , FIN_WAIT_2 和 TIME_WAIT, CLOSED 状态.
注意: 从 TIME_WAIT 状态到 CLOSED 状态, 有一个 超时设置.
为什么设置成 2MSL?

这个超时设置是 2×MSL (2毫秒). 保证服务端能收到ACK, 防止 客户端已经关闭, 而 服务端永远关闭不了 的情况出现.

被动关闭 的一方有 CLOSE_WAIT, CLOSED 状态.

流程: (1) A 发送FIN关闭连接请求到B.
(2) B 响应ACK给A. 此时出现大量的 CLOSE_WAIT 状态, 程序还没有调用 .close() 方法.
(3) B 发送FIN关闭连接的请求A. 同时调用 .close() 方法.
(4) A 响应ACK给B.

为什么要四次挥手? 三次挥手行不行.
不行. 因为(2)是 系统自动响应 的数据包, (3)是 程序手动调用 .close()方法 发送关闭连接的数据包.
在这里插入图片描述
4 流量控制: 接收端 接受能力有限, 需要 告知发送端 发送数据的大小. 通过 窗口大小字段, 来设置 接收缓冲区 可用空间大小.

5 拥塞控制: 发送端在不清楚网络状况的情况下,贸然发送大量数据可能引起网络拥堵.TCP的慢启动机制,先发少量数据探路, 摸清当前网络拥堵状况,再决定按照多大的速度传输. (刚开始是指数级增长方式设置窗口大小来探路,达到阈值转为线性增长)

5 TCP怎么实现效率保证?
在这里插入图片描述
1 滑动窗口: 通过流量控制 提高效率. 窗口大小 是 无需等待确认应答而可以 继续发送数据的 最大值. (由 发送端拥塞窗口+接收端流量控制窗口决定). 接收端 下一个序号 依赖接收到的 连续 的数据包最大的序号. 发送端 窗口向下 滑动的依赖条件: 接收到的 ACK下一个序号的 最大值, 作为窗口滑动的 起始位置.
(1) 一开始的窗口大小是4000. 若每次都能接收到, 则窗口下滑到4001位置.
(2) 窗口中的数据是 同时发送的 (有接收缓冲区).
(3) 若 1001-2000 位置的数据 发送失败. 则 后面几行确认应答会响应 下一个是1001.
(4) 因为最大的连续ACK序号是1-1000, 所以窗口发送完毕之后只会 向下移动一行到 4001行. 同时响应 下一个是1001.
(5) 若之后 1001-2000 的数据发送成功了, 窗口会滑到 7001行, 响应 下一个是4001. 循环往复.

2 延迟应答: 接收端收到数据包, 不用立即返回ACK, 稍等一段时间. 让进程 处理接收缓冲区数据, 这样返回的 ACK数据包的窗口大小可以设置的 更大 (流量控制).
3 捎带应答: 有些数据包是可以合并的, 比如ACK响应和自己要发送的数据包 -->多次网络数据传输合并为一起, 提高效率.

6 TCP其它问题:
粘包问题: TCP存在, 而UDP没有. TCP要 明确包之间的分界 (分隔符,长度).
长 / 短连接: 是否保持连接. 短连接中, 接收端 每次 接收到数据并响应后都会关闭连接.

7 TCP套接字. 服务端编程会调用 listen(), 客户端会调用 bind(). bind() 不会造成阻塞.

9 用UDP实现可靠传输 (面试题): 参考TCP在应用层实现 类似机制:
引入序列号, 引入确认应答机制, 引入超时重传机制 等等.

10 MTU: 数据链路层对应的物理层产生的限制. 如果 数据包长度过大就会对数据包分片, 在发送端进行分片, 在接收端还原还要使用这些字段.

TCP 练习题.
主机A向主机B连续发送了两个TCP报文段,其序号分别为70和100.

(1). 第一个报文段携带了多少字节的数据? 数据为从70-99 ,100-70=30.
(2). 主机B收到第一个报文段后发回的确认号应当是多少? 发回受到的确认号为100(表示下一个数据要从100开始).
(3). 如果B收到第二个报文段后发回的确认号是180,试问A发送的第二个报文段的数据有多少字节? 确认号为180,则数据为180-100=80.
(4). 如果A发送的第一个报文段丢失了,但第二个到达B,B在第二个报文段到达后向A发送了确认。试问这个确认号应为多少? 由于没有收到第一个报文段,则确认号为70.

IP.
1 IP地址 = 网络号 + 主机号. 如 192.167.0.1
(1) 网络号: 区分两个主机 是否在同一网段, 若相同即在同一网段. 前三位192.167.0 为网络号.
(2) 主机号: 同一网段 内主机之间有 相同的网络号, 但必须有 不同 的主机号. 最后一位 1 为主机号.
2 IP地址 分为5类.
在这里插入图片描述
3 子网掩码: 屏蔽一个IP地址的网络部分的 “全1” 模式.
(1) 对于 A类 地址来说, 默认的子网掩码是255.0.0.0;
(2) 对于 B类 地址来说默认的子网掩码是255.255.0.0;
(3) 对于 C类 地址来说默认的子网掩码是255.255.255.0;

私有IP地址: 随着IP网络的发展, 为了节省可分配的注册IP地址, 有一些地址被拿出来用于私有IP地址. 私有IP地址范围的是:
在 A类 地址中,10.0.0.0 到 10.255.255.255是私有地址
在 B类 地址中,172.16.0.0 到 172.31.255.255是私有地址.
在 C类 地址中,192.168.0.0 到 192.168.255.255是私有地址.

4 子网掩码的作用:分离出 IP地址 中的 网络地址 和 主机地址. 然后根据 是否在同一局域网 而决定哪一种 发送数据的方式(参考网络初识部分).
(1) 将 IP地址 和 子网掩码 255.255.255.0 进行 “按位与” 操作, 可以得到 网络号. 192.167.0.× (可以判断两个主机是否在同一个局域网).
(2) 将 IP地址 和 子网掩码 255.255.255.0 取反, 然后进行 “按位与” 操作, 可以得到 主机号. ×.×.×.1

5 一般的路由器都带有 DHCP 功能 (能自动的给子网内 新增主机节点分配IP地址, 避免了手动管理IP的不便).

6 路由: IP数据包的传输过程也和 问路一样.
(1) 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
(2) 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
(3) 依次反复, 一直到达目标IP地址;

7 NAT 技术. 是一种把内部私有网络地址(IP地址) 翻译成合法网络IP地址的技术. 可以有效的 缓解了IP地址不足的问题.
8 NAPT 技术. 局域网IP / 私网IP(主机A的IP)+源端口 转换为 公网IP+路由器公网端口.

9 常见端口号: tomcat 8080. mysql 3306. http 80. https 443.
FTP 21.
SSH 22.
Telnet 23.
SMTP 25.
DNS 53.

10 常见的协议:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值