OSI-传输层
端口号(2字节)
SYN(1bit)
ACK(1bit)
会话多路复用(为什么一个IP地址可以做很多事情?)
源端口地址可以不同
五元组(世界上没有相同的2个五元组)
源IP地址-目的IP地址-源端口号-目的端口号-协议号
端口
0-65535
0-1023 知名端口号
1024-65535
系统部分应用使用的协议
端口号 | 应用程序 | 中文名字 | 协议 |
---|---|---|---|
20/21 | FTP | 文件传输协议(传大文件的) | TCP |
22 | SSH | 远程管理应用(安全,加密) | TCP |
23 | telent | 远程管用协议(不安全) | TCP |
25 | SMTP | 简单邮件传输协议(只管发邮件) | TCP |
53 | DNS | 域名解析协议 | UDP/TCP |
69 | TFTP | 传小文件的 | UDP |
80 | HTTP | 超文本传输协议 | TCP |
110 | POP3 | 收邮件 | TCP |
161/162 | SNMP | 网络管理协议 | UDP |
179 | BGP | 外部网关路由协议 | TCP |
443 | HTTPS | (HTTP+SSL)安全的http | TCP |
520 | RIP | 动态路由协议 | UDP |
521 | RIPng | 下一代动态路由协议 | UDP |
TCP vs UDP
UDP特点(基于数据报)
1.无连接(只要知道发送的ip和端口就可以直接发送,即使对方不在线,也不用提前建立连接)
2.不可靠(没有重传和确认机制,即使数据没有发送到对方也不会有任何反应)
3.面向数据报(可以发空数据,即使是空数据也可以发送,其实他是给空数据也装上了报头,所以其实他不为空)
4.简单快速
5.有传输上限,64k
6.首部开销小,8字节
TCP(基于字节流)
1.基于连接(3次握手,4次挥手)
2.传输可靠(看下面)
3.只能一对一通信
4.首部最小20字节,最大60字节
TCP的可靠性
可靠性的基础
1.数据传输是有序的
2.数据传输是有确认机制的
3.有数据重传机制
4.可靠性的前提是建立一条连接
TCP三次握手
字段 含义
URG 紧急指针是否有效。为1,表示某一位需要被优先处理
ACK 确认号是否有效,一般置为1。
PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
RST 对方要求重新建立连接,复位。
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN 希望断开连接。
1.第一次握手:Client想要和Sever建立连接,随机产生一个序列号seq=j,将标志位SYN置为1,并将数据包发送给Server,Clinet进入SYN_SENT状态,等待Sever确认。
2.第二次握手:Sever收到数据包知道Client想要建立连接,SYN标志位置为1表示请求和对方建立连接,ACK标志位置为1表示同意建立连接,ack=J+1,client端的seq告诉你我要发数据了发x个,server端发送的x+1是告诉对方,你发的x个数据包我都收到了(确认作用),下次就从x+1开始发吧,发送自己随机产生的序列号seq=K,Server进入SYN_RCVD状态。(这部分原来是由两部分组成的,为了提高效率,把服务器确认连接,和服务器请求和客户端连接合二为一了)
3.第三次握手:Client收到确认后,检查ack是否为J+1,ACk是否为1,如果正确则将标志位ACK置为1,ack=K+1,表示收到K之前的数据,并将数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP四次握手
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
总结
首先TCP连接是双工的,那么要想要在服务器和客户端之间沟通,需要打通两条数据通路,一条是客户端到服务器的通路,一条是服务器到客户端的通路
tcp三次握手
假设客户端想和服务端建立tcp连接
1.客户端发送
(请求和服务器连接):首先客户端需要向服务器发送了一个一比特的SYN标志位,并设置为1,表示请求建立连接,和一个随机产生的序列号seq=j,发送数据包,然后进入SYN_SENT状态,等待服务器的响应。
2.服务端接收发送
服务器接收:服务器接收到了数据包,知道客户端想要建立连接
服务器发送:1.服务端需要发送一个一比特的ACK标志位为1表示确认建立连接,和发送一个ack=j+1的序列号表示客户端发送的数据都接收到了
2.服务器需要向客户端发送了一个一比特的SYN标志位,并设置为1,表示请求建立连接,和一个随机产生的序列号seq=j,发送数据包,然后服务器进入SYN_RCVD状态。
3.客户端接收发送
客户端接收:客户端接收数据包,发现ACK=1(表示服务器确认连接)在查看ack=j+1之前客户端发送的序列号,服务端都收到了(确认作用),客户端到服务端的通路建立成功。然后发现SYN=1和seq=k,表示服务器想要和客户端建立连接
客户端发送:客户端发送ACK=1和seq=k+1,表示同意建立连接。当服务端接收到数据包后,确认连接。tcp建立成功
tcp四次挥手
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
1.客户端发送
客户端想要和服务端断开连接,客户端发送一个fin置为1,表示希望断开连接
2.服务端接收和发送
服务端接收到数据包,接收到fin知道客户端想要断开连接
服务端发送数据包,发送一个ack=1表示收到你的请求
3.客户端接收和发送
客户端接收到数据包,知道服务端收到客户端的请求断开连接的请求并表示同意
客户端发送数据包,发送数据包给服务端,可以断开连接了
4.服务端接收
服务端,服务端收到客户端的可以断开连接,于是tcp连接断开成功
具体参考博客https://www.cnblogs.com/Qing-840/p/9283367.html