Netty前置基础—UNIX网络编程 卷1 套接字联网API 笔记整理 第1,2章

1.OSI模型

描述一个网络中各个协议层的常用方法就是使用国际化标准组织OSI的计算机通信开放系统互连模型,这是一个七层模型,图中同时给出了它与网际协议族的近似映射。

  • OSI底层的两个层都是系统提供的设备驱动程序和网络硬件,通常情况下,出需要知道数据链路的某些特征之外,我们不必要关心这两层的具体情况。

  • 网络层由ipv4和ipv6协议来处理,可以选择的传输层有TCP或者UDP,网络应用绕过传输层直接通过IPV4或者IPV6是有可能的。这就是所谓的原始套接字。

  • OSI模型的顶上三层被合并成一层,称为应用层,这就是web客户,Telnet客户,Web服务器,ftp服务器和其他我们在使用的网络应用所在的层,对于网际协议,OSI模型的顶上三层协议几乎没有任何区别。

  • 如何使用套接字编写使用TCP和UDP的网络应用程序。

  • 顶上三层处理具体的网络应用的所有细节,却对通信的细节了解很少,底下三层对网络业务的了解很少,但处理全部的通信细节。,发送数据,等待确认,给无序到达的数据排序,计算并验证校验和,等等。

  • 理由之二是顶上三层通常组成所谓的用户进程,而下面的几个通常是作为操作系统内核的一部分·提供。

  • Unix和现代的操作系统都提供分割用户进程和内核的机制,由此可见,第四层和第五层之间的接口自然是构建API的自然位置。

2.传输层:TCP,UDP和SCTP

2.1概述

本章的焦点是传输层,包括TCP、UDP和SCTP (Stream Control Transmission Protocol,流控制传输协议)。绝大多数客户/服务器网络应用使用TCP或UDP。SCTP是一个较新的协议,最初设计是用于跨因特网传输电话指令。

2.2总图

虽然这些协议族叫做TCP/IP,但是除了这两个协议之外,还有很多其他的成员,图中展示了有哪些协议,

traceroute程序使用两种套接字,IP套接字用于访问IP,ICMP套接字用于访问ICMP,我们将开发ping和traceroute这两个应用的IPv4和IPv6版本。

2.4 传输控制协议

由TCP向应用程序提供的服务不同于UDP提供的服务。

首先,TCP提供客户端和服务器之间的连接,TCP客户先于某个给定服务器建立一个连接,再跨该连接和哪个服务器交换数据,然后终止这个连接。

其次TCP提供了消息的可靠性,当TCP向另一端发送数据的时候,他要求对端传回一个确认,如果没有收到确认,TCP就会自动重传数据并且等待更长时间,在数次重传失败后,TCP才会放弃传输,如此在尝试发送数据所花的总时间一般为4-10分钟(依赖于具体实现)。

  • 注意,TCP并不能保证一定会被对方端点所接受,因为这是不可能做到的,如果有可能,TCP就把数据递送到对方的端点,否则就通知用户,这么说来,TCP不能被描述为100%可靠的协议,它提供的是数据的可靠送达或故障的可靠通知。

TCP含有用于动态估算客户和服务器之间的往返时间的算法,以便于知道等待一个确认需要多少时间,举例来说,局域网上可能是只有几毫秒,但是跨越广域网时间就会比较久。

TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序,举例来说,假如一个应用写2048个字节到一个TCP套接字,导致TCP发送两个分节,第一个分节所含数据的序列号为1-1024,第二个分节所含的数据序列号为1025-2048,分节是TCP传递给IP的数据单元,如果这些分节非顺序到达,接收端TCP先根据他们的序列号重新排序,再把结果传递给接收应用,如果接收端TCP接收到来自对端的重复数据,他可以判定数据是重复的,从而丢弃掉重复数据。

  1. TCP提供流量控制,TCP总是在任何时候都能告知他一次能接受多少数据,这叫做通告窗口(advertised windows)。在任何时刻,该窗口支持接收缓冲区中当前可用的空间量,从而确保发送端发生的数据不会使得接收缓冲区溢出,该窗口时刻动态变化,当接收到来自发送端的数据时,窗口大小就减小,但是当接收端应用从缓冲区中读取数据时,窗口大小就增大,有可能通知窗口的大小减小为0,当TCP对应某个套接字的接受缓冲区已满,导致他必须等待应用从换戳你过去读取数据的时候,才能从对端接收数据。
  2. UDP不提供流量控制,让较快的UDP发送端以一个UDP接收端难以跟上的速率进行发送是非常容易的。

最后,TCP连接是全双工的,这也意味着一个给定的连接上应用可以在任何时刻在进出两个方向既发送数据,又接收数据。因此,TCP必须为某一个数据流方向跟踪诸如序列号和通告窗口大小等状态数据,建立一个全双工连接后,需要的话,可以把它转换成一个单工的连接。UDP也可以做到全双工(需要一些额外的操作)。

2.6 TCP连接的建立和终止

为了理解connect,accept和close这三个函数并使用netstat程序来调试TCP应用,必须了解TCP的连接如何建立和终止的,并要掌握TCP的状态转换图。

2.6.1 三路握手

建立一个TCP连接时会发生下述情形。

  1. 服务器必须准备好接收外来的连接,这通常通过调用socket,bind和listen这三个函数来完成,称之为被动打开
  2. 客户端通过调用connect发起主动打开,这导致客户TCP发送一个SYN(同步)分节,他告诉服务器客户端将在(待建立的)连接中发送数据的初始序列号,通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部,一个TCP首部以及可能有的TCP选项
  3. 服务端必须确认(ACK)客户端的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号,服务器在单个分节中发送SYN和对客户端SYN的ACK(确认)
  4. 客户必须确认服务器的SYN。

这种交换至少需要三个分组,因此称之为TCP的三次握手,图中展示了所交换的三个分节。

图中给出的客户的初始序列号为J,服务器的初始序列号为K,ACK中的确认号是发送这个ACK的一端所期待的下一个序列号,因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK中的确认号就是该SYN的初始序列号加1。

建立TCP连接好比一个电话系统,socket函数等于有电话可以用,bind函数是在告诉别人你的电话号码,这样他们可以呼叫你,listen函数是打开电话振铃,这样当有一个外来呼叫到达,你就可以听到。connect函数要求我们知道对方的电话号码,并拨打他,accept函数发生在被呼叫的电话应答之时。由accept返回客户的标识(即客户端的IP地址和端口号)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值