网络基础---传输层

网络基础—传输层

传输层的功能是负责数据从发送端传输到接收端,向他上面的应用层提供通信服务,使两台主机之间的应用进程互相通信,实现点对点的传输。

IP协议能够把分组送到目的主机,但这个分组还停留在主机的网络层,未交付给主机的应用进程,从传输层看,通信的真正端点并不是主机而是主机中的进程。即端到端的通信才是应用进程之间的通信。

理解复用和分用:
通常,一个主机的多个应用进程会和另一个主机的多个应用进程之间进行通信,此时就要用到传输层的重要功能–分用和复用。
复用是指发送方的多个应用进程都使用同一个传输层协议来传送数据
分用是指接收方在收到数据剥去首部后能将数据交付给对应的应用进程

端口号

端口号标识一个主机上进行通信的不同应用程序。

用“源IP”,“目的IP”,“源端口号”,“目的端口号”,“协议号”这个五元组来标识一个通信。也可用 netstat -n 查看

0~1023:属于知名端口号,端口号固定,对应一些常用的应用层协议
1024~65535:操作系统动态分配的端口号

常见的知名端口号:
ssh服务器:22端口
ftp服务器:21端口
telnet服务器:23端口
http服务器:80端口
https服务器:443端口

自己写程序时尽量避开知名端口号
该命令可查看知名端口号:cat /etc/services

问题:
1.一个进程是否可以绑定多个端口号?
答:可以的,绑定端口号并不是将进程绑定在端口号上,而是将文件描述符进行绑定在端口号上,我们可以多创建几个socket,分别进行绑定。在实际工作中,我们经常这样用,原因是一个端口号用来做线上服务的请求和响应,其他端口号往往做调试端口号,帮助我们通过网络的形式访问服务器的一些当前状态,进行监控和调试。
2.一个端口号是否可以被多个进程绑定?
答:通常不允许,bind()函数会直接报错。
但是我们可以通过fork()创建子进程来使父子进程都绑定在同一个端口号上,一般不建议这么干

介绍两个指令:
- netstat
用来查看网络状态
查看当前系统上的进程和那些端口号进行关联
常用 netstat -np

选项:
n 拒绝显⽰示别名,能显⽰示数字的全部转化成数字
l 仅列出有在 Listen (监听) 的服務状态
p 显⽰示建⽴立相关链接的程序名
t (tcp)仅显⽰示tcp相关选项
u (udp)仅显⽰示udp相关选项
a (all)显⽰示所有选项,默认不显⽰示LISTEN相关

扫描二维码关注公众号,回复: 2569721 查看本文章
  • pidof
    通过进程名,查看进程id
    用法:pidof 进程名
    之前我们是通过ps aux|grep 进程名这样的指令来查看进程的各种信息,若只想知道进程的pid,可通过上述方式查看,简单直观。

两个重要的传输层协议

UDP

这里写图片描述

  • UDP长度:UDP数据报(首部+数据)的长度,0~65535,64k大小限制了传输数据的大小,若超过这个值,我们就要在应用层进行手动分包,多次发送,并在接收端手动拼装(当数据长度比较大时,建议使用TCP)
  • UDP校验和:经过一系列计算生成比较短的字符串,对比短字符串,若短的不同,源一定不同,若短的相同,源一般相同。

    CRC循环冗余校验
    发送端先生成一个校验和,接收端收到数据后再次计算校验和,将新校验和和收到的校验和进行比对


特点:
类似于寄信
  • 无连接:不需要与对端建立连接,只要知道对端ip和端口号就可以通信
  • 不可靠:对方是否收到数据自己无法感知,即使出现错误也不会返回任何错误信息
  • 面向数据报:发多少取多少,一次交付,因此报文长度不宜过长或过短。
  • 全双工:双向通信(UDP的socket既能读也能写)
  • UDP没有拥塞控制。对一些实时应用(看视频,IP电话、视频会议等),运行网络丢失一些数据,但不允许太长时延,此时UDP更适合。
  • UDP支持一对一,一对多,多对一,多对多的交互通信。
  • 首部开销小,只有8个字节。

基于UDP的应用层协议:
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议。动态分配IP地址,桥接模式,每次启动主机重新分配ip地址
BOOTP:启动协议
DNS:域名解析协议,也是一套系统

TCP协议

这里写图片描述

源端口和目的端口:和UDP类似,分用功能通过端口实现
序号:本报文段数据部分第一个字节的序号
确认序号:期望收到对方下一个报文段数据部分第一个字节的序号,表明确认序号之前的所有数据已经正确收到
四位首部长度:能表示的最大长度是60(每一位表示四个字节)
六位保留位:现在不用,以后可能会用
六位标志位:(TCP首部中最重要的信息)

  • SYN:同步报文段,尝试和对方建立链接
  • ACK:确认报文段
  • FIN:结束报文段,表示要断开连接
  • RST:复位报文段,协助我们重新建立连接的操作
  • URG:紧急指针有效,若为1 ,说明该报文段中有紧急数据,应尽快传送(不排队)
  • PSH:推送报文段,两进程进行交互式通信时,一端键入命令后想要立即收到对方响应,此时将PSH置为1,接收方收到这样的报文段会立即向上交付给应用进程,而不是等缓冲区满再交付。(较少使用)

16位窗口大小:自己的接收缓冲区大小,即允许对方发送的数据量,窗口值是动态变化的。
16位校验和:检验首部和数据两部分
16位紧急指针:仅在URG为1时有效,指出紧急数据的字节数(窗口值为零时也可发送紧急数据)
选项:长度可变,最大为40字节

MSS:最大报文段
选项中一个非常重要的字段,它是指TCP报文段数据部分的最大长度,即TCP报文段长度-TCP首部长度。
TCP报文段传递到网络层时要加上一个IP首部才能组装成一个IP数据报,TCP首部和IP首部加起来最少都要40个字节,若我们的TCP报文长度太小,网络利用率就很低,而报文长度要是太长,到了IP层就要进行分片,最后到达终点又要重新组装成一个完整的TCP报文段,若是在传输过程中出错还要进行重传,开销会增大。
因此MSS应该尽量大一些,只要在IP层不需要分片就可以,由于各种其他原因,一般MSS不好确定。因此在连接建立时,双方都把自己支持的MSS写入这一字段,以后就按照这个字段的值来传输数据,若未填写,MSS默认值为536.

猜你喜欢

转载自blog.csdn.net/shidantong/article/details/81161044