OSI-传输层

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状态,完成四次挥手。

​ 上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:

img

总结

首先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

https://www.cnblogs.com/lms0755/p/9053119.html

https://blog.csdn.net/qq_38950316/article/details/81087809

原文地址:https://www.cnblogs.com/zx125/p/11311739.html