TCP UDP
---------------------
原文:https://blog.csdn.net/oney139/article/details/8103223
---------------------
- TCP和UDP的区别
TCP UDP
可靠性 | 可靠 | 不可靠 |
连接性 | 面向连接 | 无连接 |
报文 | 面向字节流 | 面向报文(保留报文边界) |
效率 | 传输效率低 | 传输效率高 |
双工性 | 全双工 | 一对一,一对多,多对一,多对多 |
流量控制 | 有(滑动窗口) | 无 |
拥塞控制 | 有(慢开始,拥塞避免,快恢复,快重传) | 无 |
传输速度 | 慢 | 快 |
应用场合 | 对效率要求低,但对准确性要求高,或者要求有连接的场景 | 对效率要求相对高,对准确性,要求相对低, |
应用示例 | TCP一般用于文件传输(FTP http 对数据准确性要求高,速度可以相对慢)发送或接受邮件(pop imap SMTP 对数据准确性要求高,非紧急应用)远程登录(telnet SSH 对数据准确性有一定要求,有连接的概念)等等; | UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快)在线视频(rtsp速度一定要快,保证视频连续,但是偶尔画一个图片桢,还是可以接受)网络语音电话(VoIP 语音数据包一般比较小,需要告诉发送,偶尔断音或串音也没有问题) |
TCP对应的协议:
- FTP: 定义了文件传输协议, 使用21端口。 常说某某计算机开了 FTP 服务便是启动了文件传输服务。下载文件,上传主页,都要用到 FTP 服务。
- Telnet: 它是一种用于远程登陆的端口, 用户可以以自己的身份远程连接到计算机上, 通过这种端口可以提供一种基于 DOS 模式下的通信服务。 如以前的 BBS 是-纯字符界面的, 支持 BBS 的服务器将 23 端口打开, 对外提供服务。
- SMTP: 定义了简单邮件传送协议, 现在很多邮件服务器都用的是这个协议, 用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口, 所以在电子邮件设置-中常看到有这么 SMTP端口设置这个栏, 服务器开放的是 25 号端口。
- POP3: 它是和 SMTP 对应, POP3 用于接收邮件。 通常情况下, POP3 协议所用的是 110 端口。 也是说, 只要你有相应的使用 POP3 协议的程序(例如 Fo-xmail 或 Outlook) , 就可以不以 Web 方式登陆进邮箱界面, 直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)
- HTTP 协议:是从 Web 服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议
- DNS: 用于域名解析服务, 将域名地址转换为 IP 地址。 DNS用的是 53 号端口。
- SNMP:简单网络管理协议,使用 161 号端口, 是用来管理网络设备的。 由于网络设备很多,无连接的服务就体现出其优势。
- TFTP(Trival File Transfer Protocal), 简单文件传输协议, 该协议在熟知端口 69 上使用 UDP服务。
TCP头部:其中ACK SYN 序号
Flag:从做到右:URG ACK PSH RST SYN FIN
ACK 设置为1表示前面的确认是有效的
PSH 表示要求对方在接到数据后立即请求递交给应用程序,而不是缓冲起来知道缓冲区接收满为止
RST 用于重置一个已经混乱的连接
SYN 用于建立连接的过程
FIN 用来释放一个连接
窗口大小:指定了从被确认的字节算起可以发送多少个字节。要深入理解这个域的含义,可以参看TCP 拥塞控制和慢启动算法
校验和:校验范围包括TCP头,数据报内容和概念性伪头部。概念性的伪头部有包括源IP,目的ip,TCP协议号
URG=1 :
当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针表明了紧急数据的尾部。入control+c:这个命令要求操作系统立即停止当前进程。此时,这条命令就会存放在数据包数据部分的开头,并由紧急指针标识命令的位置,并URG字段被置为1
PSH=1
当接收放收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后,在提交。一些交互式应用需要这样的功能,降低命令的响应时间。
RST=1
当该值为 1时,表示当前TCP连接出现严重的问题,必须要释放重连。
暂时需要的信息:
ACK:TCP协议规定,只有ACK=1时候有效,也规定建立连接后所发送报文的ACK必须为1;
SYN(SYNchronization)用来建立连接时同步序号;当SYN=1而ACK=0时,这是一个连接请求报文;对方若是同意建立连接,则应在响应报文中使用SYN=1,ACK=1.因此SYN置1,就表示连接请求报文或连接接收报文。
FIN:即完成;用来释放一个连接,当FIN=1,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
三次握手过程:
下面是四次挥手释放连接的过程
当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1, 服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。 A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。
为什么要等待呢?
为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求后 WAIT_TIME会重新记时)
另外服务器B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢? 就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。