青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

分享知識

與大家一起分享知識

C++博客 首頁 新隨筆 聯系 聚合 管理
  19 Posts :: 3 Stories :: 45 Comments :: 0 Trackbacks
TCP連接的建立和終止

為了幫助我們理解conncet,accept,close這幾個函數,以及使用netstat工具來調試TCP應用程序,我們必須理解TCP連接是如何建立和終止的和TCP狀態轉換圖。

三次握手

當一個TCP連接建立時,發生了以下場景:

  1. The server must be prepared to accept an incoming connection. This is normally done by calling socket, bind, and listen and is called a passive open.

  2. The client issues an active open by calling connect. This causes the client TCP to send a "synchronize" (SYN) segment, which tells the server the client's initial sequence number for the data that the client will send on the connection. Normally, there is no data sent with the SYN; it just contains an IP header, a TCP header, and possible TCP options (which we will talk about shortly).

  3. The server must acknowledge (ACK) the client's SYN and the server must also send its own SYN containing the initial sequence number for the data that the server will send on the connection. The server sends its SYN and the ACK of the client's SYN in a single segment.

  4. The client must acknowledge the server's SYN.

最少需要三次包交換,因此稱作TCP的三次握手,如下圖所示:
圖示:?TCP 的三次握手

graphics/02fig02.gif

We show the client's initial sequence number as J and the server's initial sequence number as K. The acknowledgment number in an ACK is the next expected sequence number for the end sending the ACK. Since a SYN occupies one byte of the sequence number space, the acknowledgment number in the ACK of each SYN is the initial sequence number plus one. Similarly, the ACK of each FIN is the sequence number of the FIN plus one.

An everyday analogy for establishing a TCP connection is the telephone system [Nemeth 1997]. The socket function is the equivalent of having a telephone to use. bind is telling other people your telephone number so that they can call you. listen is turning on the ringer so that you will hear when an incoming call arrives. connect requires that we know the other person's phone number and dial it. accept is when the person being called answers the phone. Having the client's identity returned by accept (where the identify is the client's IP address and port number) is similar to having the caller ID feature show the caller's phone number. One difference, however, is that accept returns the client's identity only after the connection has been established, whereas the caller ID feature shows the caller's phone number before we choose whether to answer the phone or not. If the DNS is used (Chapter 11), it provides a service analogous to a telephone book. getaddrinfo is similar to looking up a person's phone number in the phone book. getnameinfo would be the equivalent of having a phone book sorted by telephone numbers that we could search, instead of a book sorted by name.

TCP 選項

Each SYN can contain TCP options. Commonly used options include the following:

  • MSS option. With this option, the TCP sending the SYN announces its maximum segment size, the maximum amount of data that it is willing to accept in each TCP segment, on this connection. The sending TCP uses the receiver's MSS value as the maximum size of a segment that it sends. We will see how to fetch and set this TCP option with the TCP_MAXSEG socket option (Section 7.9).

  • Window scale option. The maximum window that either TCP can advertise to the other TCP is 65,535, because the corresponding field in the TCP header occupies 16 bits. But, high-speed connections, common in today's Internet (45 Mbits/sec and faster, as described in RFC 1323 [Jacobson, Braden, and Borman 1992]), or long delay paths (satellite links) require a larger window to obtain the maximum throughput possible. This newer option specifies that the advertised window in the TCP header must be scaled (left-shifted) by 0–14 bits, providing a maximum window of almost one gigabyte (65,535 x 214). Both end-systems must support this option for the window scale to be used on a connection. We will see how to affect this option with the SO_RCVBUF socket option (Section 7.5).

    To provide interoperability with older implementations that do not support this option, the following rules apply. TCP can send the option with its SYN as part of an active open. But, it can scale its windows only if the other end also sends the option with its SYN. Similarly, the server's TCP can send this option only if it receives the option with the client's SYN. This logic assumes that implementations ignore options that they do not understand, which is required and common, but unfortunately, not guaranteed with all implementations.

  • Timestamp option. This option is needed for high-speed connections to prevent possible data corruption caused by old, delayed, or duplicated segments. Since it is a newer option, it is negotiated similarly to the window scale option. As network programmers there is nothing we need to worry about with this option.

These common options are supported by most implementations. The latter two are sometimes called the "RFC 1323 options," as that RFC [Jacobson, Braden, and Borman 1992] specifies the options. They are also called the "long fat pipe options," since a network with either a high bandwidth or a long delay is called a long fat pipe. Chapter 24 of TCPv1 contains more details on these options.

TCP 連接的終止

TCP建立時需要三次通知,而終止一個TCP連接時需要四次通知。
One application calls close first, and we say that this end performs the active close. This end's TCP sends a FIN segment, which means it is finished sending data.

  1. The other end that receives the FIN performs the passive close. The received FIN is acknowledged by TCP. The receipt of the FIN is also passed to the application as an end-of-file (after any data that may have already been queued for the application to receive), since the receipt of the FIN means the application will not receive any additional data on the connection.

  2. Sometime later, the application that received the end-of-file will close its socket. This causes its TCP to send a FIN.

  3. The TCP on the system that receives this final FIN (the end that did the active close) acknowledges the FIN.

Since a FIN and an ACK are required in each direction, four segments are normally required. We use the qualifier "normally" because in some scenarios, the FIN in Step 1 is sent with data. Also, the segments in Steps 2 and 3 are both from the end performing the passive close and could be combined into one segment. We show these packets in Figure 2.3.

Figure 2.3. Packets exchanged when a TCP connection is closed.

graphics/02fig03.gif

A FIN occupies one byte of sequence number space just like a SYN. Therefore, the ACK of each FIN is the sequence number of the FIN plus one.

Between Steps 2 and 3 it is possible for data to flow from the end doing the passive close to the end doing the active close. This is called a half-close and we will talk about this in detail with the shutdown function in Section 6.6.

The sending of each FIN occurs when a socket is closed. We indicated that the application calls close for this to happen, but realize that when a Unix process terminates, either voluntarily (calling exit or having the main function return) or involuntarily (receiving a signal that terminates the process), all open descriptors are closed, which will also cause a FIN to be sent on any TCP connection that is still open.

Although we show the client in Figure 2.3 performing the active close, either end—the client or the server—can perform the active close. Often the client performs the active close, but with some protocols (notably HTTP/1.0), the server performs the active close.

TCP 狀態轉換圖

關于TCP連接的建立和終止操作可以由一個狀態轉換圖來詳細說明,如下圖所示:
圖示:TCP 狀態轉換圖
graphics/02fig04.gif

There are 11 different states defined for a connection and the rules of TCP dictate the transitions from one state to another, based on the current state and the segment received in that state. For example, if an application performs an active open in the CLOSED state, TCP sends a SYN and the new state is SYN_SENT. If TCP next receives a SYN with an ACK, it sends an ACK and the new state is ESTABLISHED. This final state is where most data transfer occurs.

The two arrows leading from the ESTABLISHED state deal with the termination of a connection. If an application calls close before receiving a FIN (an active close), the transition is to the FIN_WAIT_1 state. But if an application receives a FIN while in the ESTABLISHED state (a passive close), the transition is to the CLOSE_WAIT state.

We denote the normal client transitions with a darker solid line and the normal server transitions with a darker dashed line. We also note that there are two transitions that we have not talked about: a simultaneous open (when both ends send SYNs at about the same time and the SYNs cross in the network) and a simultaneous close (when both ends send FINs at the same time). Chapter 18 of TCPv1 contains examples and a discussion of both scenarios, which are possible but rare.

One reason for showing the state transition diagram is to show the 11 TCP states with their names. These states are displayed by netstat, which is a useful tool when debugging client/server applications. We will use netstat to monitor state changes in Chapter 5.

觀察包(Watching the Packets)

下土顯示了一個TCP連接實際發生的包交換情況:連接建立,數據傳輸和連接終止。在每一端傳輸的時候,也給出了TCP狀態。?
TCP 連接的包交換

graphics/02fig05.gif

The client in this example announces an MSS of 536 (indicating that it implements only the minimum reassembly buffer size) and the server announces an MSS of 1,460 (typical for IPv4 on an Ethernet). It is okay for the MSS to be different in each direction (see Exercise 2.5).

Once a connection is established, the client forms a request and sends it to the server. We assume this request fits into a single TCP segment (i.e., less than 1,460 bytes given the server's announced MSS). The server processes the request and sends a reply, and we assume that the reply fits in a single segment (less than 536 in this example). We show both data segments as bolder arrows. Notice that the acknowledgment of the client's request is sent with the server's reply. This is called piggybacking and will normally happen when the time it takes the server to process the request and generate the reply is less than around 200 ms. If the server takes longer, say one second, we would see the acknowledgment followed later by the reply. (The dynamics of TCP data flow are covered in detail in Chapters 19 and 20 of TCPv1.)

We then show the four segments that terminate the connection. Notice that the end that performs the active close (the client in this scenario) enters the TIME_WAIT state. We will discuss this in the next section.

It is important to notice in Figure 2.5 that if the entire purpose of this connection was to send a one-segment request and receive a one-segment reply, there would be eight segments of overhead involved when using TCP. If UDP was used instead, only two packets would be exchanged: the request and the reply. But switching from TCP to UDP removes all the reliability that TCP provides to the application, pushing lots of these details from the transport layer (TCP) to the UDP application. Another important feature provided by TCP is congestion control, which must then be handled by the UDP application. Nevertheless, it is important to understand that many applications are built using UDP because the application exchanges small amounts of data and UDP avoids the overhead of TCP connection establishment and connection termination.

TIME_WAIT 狀態

毫無疑問,關于網絡編程中最讓人誤解點之一就是 TIME_WAIT?狀態。 在一端調用了close之后,該端維持這個狀態的時間為兩倍最大段生存時間(maximum segment lifetime (MSL))。

Every implementation of TCP must choose a value for the MSL. The recommended value in RFC 1122 [Braden 1989] is 2 minutes, although Berkeley-derived implementations have traditionally used a value of 30 seconds instead. This means the duration of the TIME_WAIT state is between 1 and 4 minutes. The MSL is the maximum amount of time that any given IP datagram can live in a network. We know this time is bounded because every datagram contains an 8-bit hop limit (the IPv4 TTL field in Figure A.1 and the IPv6 hop limit field in Figure A.2) with a maximum value of 255. Although this is a hop limit and not a true time limit, the assumption is made that a packet with the maximum hop limit of 255 cannot exist in a network for more than MSL seconds.

The way in which a packet gets "lost" in a network is usually the result of routing anomalies. A router crashes or a link between two routers goes down and it takes the routing protocols seconds or minutes to stabilize and find an alternate path. During that time period, routing loops can occur (router A sends packets to router B, and B sends them back to A) and packets can get caught in these loops. In the meantime, assuming the lost packet is a TCP segment, the sending TCP times out and retransmits the packet, and the retransmitted packet gets to the final destination by some alternate path. But sometime later (up to MSL seconds after the lost packet started on its journey), the routing loop is corrected and the packet that was lost in the loop is sent to the final destination. This original packet is called a lost duplicate or a wandering duplicate. TCP must handle these duplicates.

There are two reasons for the TIME_WAIT state:

  1. To implement TCP's full-duplex connection termination reliably

  2. To allow old duplicate segments to expire in the network

The first reason can be explained by looking at Figure 2.5 and assuming that the final ACK is lost. The server will resend its final FIN, so the client must maintain state information, allowing it to resend the final ACK. If it did not maintain this information, it would respond with an RST (a different type of TCP segment), which would be interpreted by the server as an error. If TCP is performing all the work necessary to terminate both directions of data flow cleanly for a connection (its full-duplex close), then it must correctly handle the loss of any of these four segments. This example also shows why the end that performs the active close is the end that remains in the TIME_WAIT state: because that end is the one that might have to retransmit the final ACK.

To understand the second reason for the TIME_WAIT state, assume we have a TCP connection between 12.106.32.254 port 1500 and 206.168.112.219 port 21. This connection is closed and then sometime later, we establish another connection between the same IP addresses and ports: 12.106.32.254 port 1500 and 206.168.112.219 port 21. This latter connection is called an incarnation of the previous connection since the IP addresses and ports are the same. TCP must prevent old duplicates from a connection from reappearing at some later time and being misinterpreted as belonging to a new incarnation of the same connection. To do this, TCP will not initiate a new incarnation of a connection that is currently in the TIME_WAIT state. Since the duration of the TIME_WAIT state is twice the MSL, this allows MSL seconds for a packet in one direction to be lost, and another MSL seconds for the reply to be lost. By enforcing this rule, we are guaranteed that when we successfully establish a TCP connection, all old duplicates from previous incarnations of the connection have expired in the network.

There is an exception to this rule. Berkeley-derived implementations will initiate a new incarnation of a connection that is currently in the TIME_WAIT state if the arriving SYN has a sequence number that is "greater than" the ending sequence number from the previous incarnation. Pages 958–959 of TCPv2 talk about this in more detail. This requires the server to perform the active close, since the TIME_WAIT state must exist on the end that receives the next SYN. This capability is used by the rsh command. RFC 1185 [Jacobson, Braden, and Zhang 1990] talks about some pitfalls in doing this.

一般網絡程序所使用的協議

下圖總結了一些:

Figure 2.19. Protocol usage of various common Internet applications.

graphics/02fig19.gif

The first two applications, ping and traceroute, are diagnostic applications that use ICMP. traceroute builds its own UDP packets to send and reads ICMP replies.

The three popular routing protocols demonstrate the variety of transport protocols used by routing protocols. OSPF uses IP directly, employing a raw socket, while RIP uses UDP and BGP uses TCP.

The next five are UDP-based applications, followed by seven TCP applications and four that use both UDP and TCP. The final five are IP telephony applications that use SCTP exclusively or optionally UDP, TCP, or SCTP.

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成网站在线观看播放| 欧美午夜精品一区二区三区| 久久综合电影| 久久国产日本精品| 午夜久久tv| 欧美专区中文字幕| 欧美v日韩v国产v| 欧美成人嫩草网站| 国产日韩一区二区三区在线| 国产欧美精品一区二区三区介绍| 国产精品爱久久久久久久| 国产日韩欧美不卡| 日韩视频中午一区| 久久se精品一区精品二区| 久久亚洲精品一区二区| 最新成人av在线| 亚洲视频导航| 久久亚洲精品中文字幕冲田杏梨| 欧美 日韩 国产 一区| 国产精品色网| 一本大道久久a久久精品综合| 午夜精品一区二区三区在线视| 久久偷窥视频| 一区二区三区亚洲| 午夜影院日韩| 亚洲免费成人av| 玖玖玖国产精品| 黄色精品免费| 欧美承认网站| 久久野战av| 在线观看视频一区二区| 久久精品综合一区| 有码中文亚洲精品| 免费在线欧美视频| 久久在线视频在线| 91久久在线播放| 欧美夫妇交换俱乐部在线观看| 久久疯狂做爰流白浆xx| 国模套图日韩精品一区二区| 久久精品视频在线播放| 欧美综合国产精品久久丁香| 激情久久影院| 欧美香蕉视频| 性高湖久久久久久久久| 亚洲免费网站| 激情综合五月天| 亚洲国产精品久久久久婷婷884| 欧美激情亚洲| 欧美一区网站| 欧美欧美天天天天操| 午夜精品久久久久久久久久久久久 | 一本色道久久综合| 亚洲视频在线一区观看| 好看的日韩av电影| 91久久精品美女| 国产亚洲精品激情久久| 亚洲激情第一区| 国产午夜精品全部视频在线播放| 欧美成人免费在线| 国产视频一区免费看| 亚洲人成网站777色婷婷| 国产欧美婷婷中文| 一区二区三区你懂的| 亚洲黄色免费网站| 欧美一区视频| 欧美在线视频观看| 国产精品亚发布| 9人人澡人人爽人人精品| 日韩视频在线观看国产| 你懂的一区二区| 美女主播视频一区| 亚洲国产精品久久久久| 久久一区二区三区四区| 欧美暴力喷水在线| 最新亚洲一区| 欧美四级在线观看| 999亚洲国产精| 欧美成人中文字幕在线| 亚洲国产成人不卡| 在线视频中文亚洲| 国产情侣久久| 久久综合色婷婷| 亚洲国产精品va在线观看黑人| 91久久久久久久久| 欧美日韩国产在线看| 亚洲一区二区三区精品在线| 久久这里只精品最新地址| 亚洲国产精品一区制服丝袜| 欧美日韩免费观看一区二区三区 | 久久久精品动漫| 国内一区二区在线视频观看| 久久精品主播| 一本色道久久综合亚洲精品不卡 | 亚洲激情啪啪| 久久精品一区二区三区中文字幕 | 亚洲人成亚洲人成在线观看图片 | 亚洲欧美日韩区| 欧美激情乱人伦| 久久久久久亚洲精品中文字幕 | 国产精品一区二区三区免费观看| 久久av一区| 一区二区三区不卡视频在线观看| 蜜桃av噜噜一区| 久久久久一区| 欧美中文字幕在线播放| 亚洲视频综合在线| 一道本一区二区| 国产午夜久久久久| 久久国产精品久久精品国产| 亚洲另类在线视频| 欧美国产日韩亚洲一区| 一本色道久久88综合亚洲精品ⅰ| 曰本成人黄色| 亚洲大片av| 99精品视频免费观看| 亚洲综合视频在线| 欧美在线999| 久久riav二区三区| 欧美大胆成人| 一本色道久久综合亚洲精品按摩| 亚洲三级电影全部在线观看高清| 亚洲成色999久久网站| 亚洲国产视频直播| 亚洲制服少妇| 裸体丰满少妇做受久久99精品| 欧美成人免费视频| 国产精品久久久久免费a∨| 国内久久婷婷综合| 亚洲一品av免费观看| 久久亚洲综合网| 在线综合欧美| 欧美精品综合| 韩国av一区二区三区四区| 在线看国产日韩| 亚洲欧美日韩精品久久亚洲区| 欧美xx69| 欧美在线视频日韩| 国产一区二区成人久久免费影院| 亚洲卡通欧美制服中文| 久久久国产一区二区| 99www免费人成精品| 欧美大片免费观看在线观看网站推荐| 国产日韩欧美黄色| 久久国产免费看| 欧美一区二区三区在线播放| 欧美日韩在线播放一区二区| 亚洲日本欧美日韩高观看| 欧美大片免费观看| 乱人伦精品视频在线观看| 91久久国产自产拍夜夜嗨| 日韩视频精品| 欧美激情一区二区在线| 亚洲国产裸拍裸体视频在线观看乱了| 欧美伊人精品成人久久综合97| 亚洲高清av在线| 免费一级欧美片在线观看| 国内精品久久久久久| 欧美成人免费小视频| 免费在线亚洲欧美| 中文精品视频一区二区在线观看| 亚洲精品看片| 国产精品久久久久久久免费软件| 亚洲欧美经典视频| 久久久久久国产精品一区| 91久久一区二区| 亚洲欧美综合一区| 亚洲国产福利在线| 亚洲欧美国产毛片在线| 尤物精品国产第一福利三区| 亚洲精品一区二区三| 国产日韩一区二区三区在线| 亚洲第一主播视频| 国产精品美女久久久久久免费| 久久精品99久久香蕉国产色戒| 免费的成人av| 久久精品1区| 国产精品伊人日日| 亚洲福利专区| 伊人激情综合| 久久精品在线观看| 欧美一区二区三区视频免费| 欧美黄色视屏| 亚洲福利国产| 亚洲丰满在线| 久久精品亚洲一区二区三区浴池| 亚洲愉拍自拍另类高清精品| 欧美精品 日韩| 亚洲高清在线播放| 亚洲国产一区二区视频| 久久香蕉国产线看观看av| 久久阴道视频| 亚洲美女区一区| 欧美日韩一区在线播放| 在线视频中文亚洲| 欧美专区亚洲专区| 伊人伊人伊人久久| 久久精品色图| 在线观看日产精品| 欧美伦理91| 亚洲一区二区三区在线看|