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 常见的协议:

网络原理之TCP/UDP IP相关推荐

  1. 网络原理:TCP/UDP

    目录 一.数据组织格式 1.1 xml 1.2 json 1.3 protobuffer 二.传输层重要协议---UDP协议 2.1 UDP协议端格式 2.2 校验和 三.传输层重要协议---TCP协 ...

  2. 网络原理之TCP/UDP协议

    UDP协议 UDP协议端格式 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度; 如果校验和出错, 就会直接丢弃 UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的 ...

  3. 网络基础知识 TCP UDP IP

    文章目录 一.简介TCP/IP协议 二.传输层 2.1 UDP 2.2 TCP 三.小结 一.简介TCP/IP协议 1.简介 TCP/IP是一组协议的代名词,它包括了许多承载在IP或者TCP之间或之上 ...

  4. 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述

    我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...

  5. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  6. 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程

    一个动画看懂网络原理之TCP建立和释放过程 一.TCP的概念 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.T ...

  7. 网络原理之TCP/IP协议

    文章目录 1.网络基础 1.1 认识IP地址 1.1.1概念 1.1.2 作用 1.1.3 格式 1.1.4 组成 1.1.5 分类 1.2 子网掩码 1.2.1 格式 1.2.2 作用 1.2.3 ...

  8. JavaEE:网络原理之TCP/IP

    文章目录 一.网络基础 1.认识 IP 地址 2.子网掩码 3.认识 MAC 地址 4.总结IP地址和MAC地址 二.应用层重点协议 1.DNS 2.NAT 3.NAPT 4.HTTP/HTTPS 三 ...

  9. [网络] SOCKET, TCP/UDP, HTTP, FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

最新文章

  1. php版程氏音乐cms管理系统 v3.0后台登录_程氏舞曲管理系统CMSPHP
  2. FiM | 牧医所奶业创新团队建立瘤胃微生物脲酶的靶向宏蛋白质组方法
  3. java 线性的排序算法_077-线性查找分析和实现
  4. mysql_rollback_MySQL的rollback--事务回滚
  5. 正则表达式验证各种类型的数字
  6. 计算机的安全设置在哪儿,电脑防火墙在哪里设置
  7. 初学者参考C#中操作XML修改完整版
  8. FoundationDB 开源文档数据库模型 Document Layer​​​​​​​
  9. C#强制关闭Excel进程(通过COM使用Excel时)
  10. PX4避障和轨迹规划(3DVFH*)
  11. Proxy-Server
  12. OFFICE与VISIO安装tips:版本不能并行、visio安装错误
  13. 计算机黑板报主题ps,Photoshop︱用PS创建一个黑板报
  14. 《跟阿铭学linux》(第3版)笔记
  15. 利用机器学习进行恶意代码分类
  16. 第一次用 Mac git 遇到的一些问题及解决方法,记录一下
  17. 机器人教育与编程教育的区别到底是什么?
  18. java爬虫爬取笔趣阁小说
  19. 使用Eclipse开发Spring的第一个简单程序
  20. 网络是怎样连接的--DNS服务器查询原理

热门文章

  1. iOS底层原理探究 第一探. 事件传递和响应者链
  2. hdu 1568 Fibonacci(fibonacci通项+对数性质)
  3. python dialect='excel'是什么意思_python excel自动化写入大数据量数据
  4. java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))
  5. 02 创建一个简单的Python Web程序应用
  6. hash值和history值详解区别
  7. python多线程爬虫案例之爬取麦田
  8. 区块链冷链食品追溯系统
  9. css的inherit属性
  10. cmd中启动MySQL输入net start mysql 显示‘net‘不是内部或外部命令,也不是可运行的程序或批处理的文件。