网络之传输层与TCP协议

一、传输层

1.作用

负责数据的传送,保证数据能够从发送端传输至接收端。

2.端口号

2.1 一些概念

端口号用来标识特定主机上的唯一一个网络服务进程。

IP地址:用来标识公网中的一台主机。

套接字=IP+端口号,因此套接字可以唯一标识互联网中的一个进程。

2.2 端口号范围划分

0~1023:知名端口号,HTTP、FTP、SSH等这些广为使用的应用层协议,它们的端口号都是固定的。

1024~65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围划分的。

我们自己写程序时,要避免使用知名端口号。

2.3 认识知名端口号

服务器端口号
http80
https443
mysql3306
ssh22
ftp21
telnet23

查看知名端口号的命令

cat /etc/services

2.4 两个问题

一个进程是否可以绑定多个端口号?  可以

一个端口号是否可以被多个进程绑定?  不可以,因为端口号是唯一标识特定主机上的一个进程。

2.5 一些命令

netstat    查看网络状态
语法:netstat [选项]
常用选项:
n  拒绝显示别名,能显示数字的全部转化为数字
l  仅列出有在Listen(监听)的服务程序
p  显示建立相关链接的程序名
t  (tcp)仅显示出tcp相关选项
u  (udp)仅显示出udp相关选项
a  (all)显示所有选项,默认不显示LISTEN相关
iostat  查看IO信息
pidof 查看服务器的进程
语法:pidof  [进程名]
功能:通过进程名,查看进程ID。
ps aux | grep [进程名]   查看网络进程
eg:ps aux | grep tcpserver等价于 pidof tcpserver
ps -ef | grep java 查看Java进程
ping www.baidu.com  查看是否联网的状态

二、UDP协议

1.格式

很明显,UDP的报头为定长,共占8字节。因此,将UDP的报头和有效载荷正确分离的方法是定长。

在UDP的报头中,16位源端口号表示从哪个进程来,16位目的端口号表示要到哪里去。16位UDP长度指整个报文的长度,因此UDP的最大长度为2的16次方,即64K.16位检验和在一定程度上保证交互给下一次层,但是丢包问题不一定会重发。如果检验和出错,则会直接丢弃。

如果我们需要传送的数据大于64K,就需要在应用层手动分包,多次发送,并在接收端手动拼装。

2.UDP的特点

无连接:知道对端的IP和端口号就直接进行传输,通信不需要建立连接。

不可靠:这是一个中性词。因为UDP没有确认机制、重传机制,不能确保数据到达。如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。

面向数据报:指应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并,而且发送端发送多少次多少数据,接收端接收多少次多少数据。UDP不能够灵活地控制读写数据的次数和数量。

UDP的优点:因为没有确认机制、重传机制,因此较简单、高效。

3.UDP的缓冲区

UDP没有真正意义上的发送缓冲区,但是有接收缓冲区。

UDP调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输工作。

UDP的接收缓冲区不能保证接收到UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。

4.基于UDP的应用层协议

NFS:网络文件系统

TFTP:简单文件传输协议

DHCP:动态主机配置协议

BOOTP:启动协议(用于无盘设备启动)

DNS:域名解析协议

自定义应用层协议

三、TCP协议

1.格式

TCP报文的结构:

16位源端口号16位目的端口号分别说明了该报文从哪儿来,要到哪儿去。

发送方对自己发送的数据进行编号,形成序号;接收方会对发送方发送的数据进行确认,即生成确认序号。一般来说,确认序号比序号要大1,提示发送方下一条发送的数据从哪开始。同时,序号和确认序号也保证了数据的有序到达,确认序号机制以及去重机制(后面详细讲)。这些都保证了数据传输的可靠性。

4位首部长度(即报头长度),单位是4字节,故报文的最大长度是1111*4=15*4=60字节。而从TCP的结构可以看出,报头的标准长度是4*5=20字节。因此,根据报头长度,TCP协议将报头和有效载荷正确分离的方式也是定长。

6位标志位

URG:标识紧急指针是否有效,便于将URG标识的信息优先处理。

ACK:确认号是否有效。发出消息并且确认对方是否收到消息。

PSH:提示接收端应用程序尽快从TCP缓冲区把数据读走,这一工作由操作系统完成。

RST:对方要求重新建立连接。我们把携带RST标识的称为结束报文段。

SYN:请求建立连接。我们把携带SYN标识的称为同步报文段。

FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段。

16位窗口大小:自己的接收缓冲区的剩余空间大小。流量机制

16位校验和:发送 端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的校验和不光包括TCP首部,还包括TCP数据部分。

16位紧急指针大小:标识哪部分数据是紧急数据。

40字节头部选项:暂时忽略。

2.三次握手与四次挥手

三次握手:

(1)客户端向服务器端发送SYN段,指明客户打算连接的服务器端接口以及初始序号(SEQ),请求建立连接。

(2)服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN+1,用来对客户的SYN报文段进行确认,一个SYN占用一个序号。

(3)客户必须将确认序号设置为服务器的ISN+1,用来对服务器的SYN段进行确认。

只有这三次都完成,才说明建立了TCP连接。

为什么需要三次操作成功才能建立连接?

如果只有(1),客户端和服务器端将都认为未建立连接(因为服务器端没有确认,故客户端也认为未建立连接)。如果只有(1)和(2),客户端会认为成功建立连接,但服务器端由于没有收到客户端的确认序号,因此,服务器认为未建立连接。只有进行了(3),客户端和服务器端双方都认为建立了连接。建立连接是需要花费时间和空间成本的,如果第(1)(2)步失败,客户端和服务器端将都不会为建立连接消耗资源;如果第(3)步失败,(1)(2)成功,则客户端将会花费一定的时间和空间成本来维护连接,而服务器端则不会,这就避免了如果有大量客户端要求与服务器端建立连接,服务器端要维护无用的连接而消耗的成本。

四次挥手:

(1)客户端向服务器端请求断开连接。

(2)服务器端回应,确认同意断开连接。此时有一个CLOSE_WAIT状态,说明服务器准备关闭连接(但需要处理完之前的数据)。

(3)当服务器真正调用close关闭连接时,会向客户端发送FIN,要求断开服务器端与客户端的连接。此时服务器进入LAST_ACK状态,等待最后一个ACK(这个ACK时客户端确认收到了FIN)。此时客户端接收FIN时,进入TIME_WAIT状态,等待服务器端收到最后一个ACK,同时保证数据在网络中消散开。

(4)客户端对服务器端发送确认断开连接。

TIME_WAIT状态

TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL(maximum segment lifetime)的时间才能回到CLOSED状态。MSL(TCP报文的最大生存时间)在RFC1122中规定为两分钟,但是各操作系统的实现不同,在Centos7上默认配置的值是60s。它的目的是为了保证最后一个报文可靠到达。

3.TCP的特点

可靠性

确认应答机制、数据的按序到达、16位检验和、去重机制、超时重发、流量控制、拥塞控制

TCP为了保证数据的可靠性,在效率上就会有所降低。但是TCP也提供了一些提高性能的方法:

滑动窗口、快速重传、延迟应答、捎带应答

面向字节流

4.基于TCP应用层的协议

HTTP:超文本传输协议

HTTPS:超文本传输安全协议

SSH:安全外壳协议

Telnet:远程终端协议

FTP:文本传输协议

SMTP:简单邮件传输协议

写TCP程序时自定义的应用层协议

5.TCP与UDP对比

二者没有绝对的好坏

TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景;

UDP用于对高速传输和实时性要求较高的通信领域,如早期的QQ,视频传输等。另外UDP也可以用于广播。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值