第六章 TCP与UDP

1. 传输层的作用

  1. 传输层定义
    IP会使得数据包到达目的地,但是具体这个数据包是给哪个应用程序就需要TCP等利用端口来识别了。
  2. 通信处理
    服务端的程序需要提前启动,准备接受客户端的请求
    这些服务端的程序叫做守护进程。
    比如http的服务端程序是httpd,而ssh的服务端程序叫sshd
    UNIX中不需要把这些守护进程逐一打开,而是启动一个inetd(互联网守护进程)的服务程序就行,这个程序是超级守护进程。其收到客户端请求以后就会fork新的进程并转换为各种守护进程(httpd、sshd等)
  3. 两种传输层协议TCP和UDP
  • TCP:是面向连接的、可靠的流协议(流是指不间断的数据结构)。TCP提供可靠性传输,实行“顺序控制”或“重发控制”机制。
  • UDP:不具有可靠性的数据报协议。虽然可以确保发送消息的大小,但是不能保证消息一定会到达。
  1. TCP和UDP的区分
    TCP用于需要实现可靠传输的情况
    但是在电视会议、打电话等情况下,由于TCP的重发机制,会导致丢失的数据报重新发出,却会影响通信效果。而UDP却不会重发,即使有丢包,对通信影响其实不大。
  2. socket(套接字)
    使用TCP或UDP通信时,会广泛地使用socket的API。应用程序利用socket可以设置对端的IP地址、端口号,并实现数据的发送和接收。

2. 端口号

  1. 端口号定义
    MAC地址用来识别同一个链路中不同的计算机。
    IP地址用来识别在TCP/IP网络中互连的主机和路由器。
    端口号用来识别同一台计算机中进行通信的不同应用程序。

  2. 根据端口号识别应用
    一个计算机有多个应用程序,传输层协议正是利用端口号识别本机中正在进行通信的应用程序

  3. 通过IP地址、端口号、协议号进行通信识别
    仅仅凭借目标端口来识别某一通信是不够的。
    比如开了俩浏览器,端口号是一样的。
    因此TCP/IP或UDP/IP通信中一般用5个信息来识别一个通信。它们是“源IP地址”、“目标IP地址”、“协议号”、“源端口号、“目标端口号”。只要其中有不一样的就会被认为是其他通信。

  4. 端口号如何确定
    实际通信时,端口号需要事先确定。确定端口号的方法有两种:

  • 标准既定的端口号
    也叫静态方法。每个应用程序都有其指定的端口号。每个端口号都有其对应的使用目的。
    比如http、FTP等广为使用的应用协议中使用的端口号就是固定的。这些端口号也叫知名端口号。
    除了知名端口号,还有一些端口号也被正式注册,分布在1024到49151之间。
  • 时序分配法
    客户端应用程序完全不需要自己设置端口号,而是全权交给操作系统来分配。OS会分配不冲突的端口号。
    这时候只需要服务端监听端口号就行,客户端没必要确定端口号。
  1. 端口号和协议
    端口号由其使用的传输层协议决定。不同的传输协议可以使用相同的端口号。
    数据到达IP层之后会检查其首部的协议号,如果是TCP就会传给TCP模块,如果是UDP就会传 给UDP模块去做端口号处理。因此即使是同一个端口号,由于传输协议是各自独立进行处理,因此相互之间不会受到影响。

3. UDP

  1. UDP的特点及其目的
    UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。
    UDP只提供传输层最基本的功能,是面向无连接的协议。如果需要什么细节控制,就基本只能交给采用UDP的应用程序去处理。UDP就是用户说什么就听什么。
    因此经常用在以下几个方面:
  • 包总量较少的通信(DNS, SNMP等)
  • 视频、音频等多媒体通信(即时通信)
  • 限定于LAN等特定网络中的应用通信
  • 广播通信(广播、多播)

4. TCP

  1. TCP的特点及其目的
    TCP通过IP数据报实现可靠性传输,需要考虑很多东西。

  2. 通过序列号与确认应答提高可靠性
    TCP中,如果发送端的数据到达接收主机之后,接收主机会返回已收到消息的通知,这个消息叫确认应答(ACK)。
    TCP通过ACK实现可靠的传输。如果一定时间都没有等到ACK应答,就会视作发送失败,然后重发。收到ACK就会发送回去。
    当然有时候也会出现ACK丢了的情况。这样发送端就会重复发送数据,接收端通过判断发现是相同数据就会不接收。而需要发现这是相同数据就需要一种机制:序列号。
    序列号是按照顺序给发送数据的每一个字节都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,把自己下一步应该接收的序号作为确认应答发送回去。

  3. 重发超时如何确认
    最理想的情况是找到最小时间,但是这个时间是会变化的。
    因此每次发包都会计算往返时间和偏差,将这个往返时间和偏差相加,重发超时的时间就是比这个和稍大的值。
    数据重发还是收不到ACK就会将重发时间以2倍、4倍的指数函数延长。
    也不会一直重发下去,当重发次数达到一定值以后,如果仍然没有任何响应,就判断是对端主机发生了异常,强制关闭了链接。并且通知应用通信异常强行终止了。

  4. 链接管理
    TCP是面向连接的通信传输。即在开始通信之前,先建立连接,否则不通信。
    在通信前,会先发一个SYN包作为建立连接的请求等待确认应答。如果收到ACK就认为连接建立,否则就不会进行数据通信。此外,通信结束的时候会进行断开连接的处理(FIN包)。

  5. TCP以段为单位发送数据
    建立连接的同时需要确定发送数据包的单位(最大消息长度:MSS)。
    最理想的情况是MSS正好是IP中不会被分片处理的最大数据长度。
    两端主机在建立连接的请求时,会将自己接口能适应的MSS写在MSS选项中。 最后选取双方MSS中较小的作为最终的MSS。

  6. 利用窗口进行控制
    一次以一个段作为单位发送的话通信性能会很低。
    利用窗口可以解决这个问题。即确认应答不是以每个分段而是以更大的单位进行确认,转发时间就会大幅缩短。
    也就是发送端主机在发送一个段之后不必要一直等待确认应答,而是继续发送。
    窗口大小就是无需等待ACK而可以继续发送数据的最大值。
    如果出现丢包发送端还要负责重传,因此需要缓冲区保留这些待重传的数据。
    如果如期收到ACK那么这些缓冲区中的数据就可以删除了。
    收到ACK的情况下,就把窗口滑到ACK中序列号的位置(这种机制叫滑动窗口控制)

  7. 窗口控制
    如果出现段丢失怎么办?
    情况1:ACK没能返回。这样数据已经到了,是不需要进行重发的。因此某些ACK即使丢失也无需重发。
    情况2:报文丢失。在窗口比较大又出现报文丢失的时候,同一个序号的ACK就会被重复不断地返回。发送端主机如果连续接受到3次同样的ACK就会将对应的数据重发。这也叫作高速重发控制。

  8. 流控制
    TCP提供了一种机制可以让发送端根据接受端的实际接收能力控制发送的数据量。这就是流控制。
    对窗口设置大小限制,这就是窗口大小。
    比如接收端缓冲区满了,就要停止接受数据。这时候发送端主机会时不时法案搜索那个一个叫做窗口探测的数据段,仅仅含有一个字节来获取最新的窗口大小消息。

  9. 拥塞控制
    有时候会发送大量的数据包,造成网络拥塞。
    TCP为了防止该问题会在通信一开始的时候加一个叫做慢启动的算法得出的数值,对发送的数据量进行控制。一开就把窗口设为1MSS。之后每收到ACK就将拥塞窗口的值加1。

  10. 提高网络利用率的规范

  • Nagle算法
    如果数据很少,就延迟发送。如果以下两个条件不满足,就等待一段时间后进行数据发送:
    (1)已发送的数据都已经收到ACK
    (2)可以发送MSS的数据
  • 延迟确认应答
    刚刚接收完数据,缓冲区已经满了,所以立刻返回ACK可能返回一个较小的窗口。
    因此引入方法收到数据后不立即返回ACK
  • 捎带应答
    TCP的ACK和回执数据(比如邮件等)可以通过一个包发送
  1. 使用TCP的应用
    需要考虑下是全权交给TCP还是自己进行细微的控制

5 UDP首部的格式

  • 源端口号
  • 目标端口号
  • 包长度
  • 校验和

6 TCP首部格式

比UDP首部复杂很多

  • 源端口号
  • 目标端口号
  • 序列号
  • 确认应答号
  • 数据偏移
  • 保留
  • 控制位
  • 窗口大小
  • 校验和
  • 紧急指针
  • 选项
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,513评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,312评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,124评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,529评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,937评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,913评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,084评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,816评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,593评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,788评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,267评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,601评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,265评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,158评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,953评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,066评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,852评论 2 277

推荐阅读更多精彩内容