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

分享知識

與大家一起分享知識

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>
            亚洲麻豆国产自偷在线| 午夜精品一区二区三区在线| 久久久久国内| 欧美一区在线视频| 伊人天天综合| 欧美激情视频网站| 欧美理论大片| 亚洲在线网站| 欧美一区二区三区免费看| 黑人极品videos精品欧美裸| 久久婷婷亚洲| 欧美激情久久久久久| 中国女人久久久| 亚洲欧美在线视频观看| 精品动漫3d一区二区三区免费| 美女视频黄a大片欧美| 欧美成熟视频| 欧美一区午夜精品| 久久最新视频| 亚洲欧美国产高清| 久久网站免费| 亚洲欧美成人网| 久久久噜噜噜久久中文字免| 99re66热这里只有精品4| 亚洲系列中文字幕| 亚洲第一狼人社区| 亚洲制服丝袜在线| 亚洲精品在线视频| 久久成人免费网| 亚洲天堂男人| 免费看的黄色欧美网站| 午夜精品久久久久久久白皮肤| 久久综合影视| 久久精品卡一| 欧美日韩三级| 亚洲高清不卡av| 国产欧美在线观看| 亚洲最新视频在线播放| 亚洲国产成人精品久久| 亚洲在线黄色| 一区二区三区高清在线| 久久夜色精品国产欧美乱| 欧美亚洲在线| 欧美天天综合网| 亚洲欧洲一区二区三区在线观看| 国内视频一区| 亚洲综合电影| 亚洲欧美日韩视频二区| 欧美激情一区二区| 欧美激情视频一区二区三区免费| 黄色日韩在线| 欧美中文字幕第一页| 国产精品视频1区| 欧美高清视频一二三区| 国内激情久久| 性欧美1819性猛交| 欧美一区91| 国产精品麻豆成人av电影艾秋| 亚洲日本中文字幕| 日韩视频在线一区二区| 免费看成人av| 亚洲国产精品视频| 亚洲日本欧美| 欧美激情日韩| 亚洲免费观看| 亚洲摸下面视频| 国产精品久久久久久久午夜片| 这里只有精品视频在线| 亚洲在线视频| 国产一区二区精品久久99| 欧美在线日韩精品| 久久亚洲综合色一区二区三区| 国产一区二区三区免费在线观看| 欧美一区二区精品| 美女尤物久久精品| 亚洲精品国产拍免费91在线| 欧美精品激情| 亚洲视频axxx| 久久久久久久尹人综合网亚洲| 精品成人国产在线观看男人呻吟| 久久在线免费| 亚洲人精品午夜| 午夜精品一区二区三区在线播放 | 夜夜嗨av色综合久久久综合网| 亚洲视频1区| 国产精品影院在线观看| 久久久久久久久久久久久久一区 | 亚洲日韩欧美一区二区在线| 亚洲色无码播放| 国产日韩欧美在线播放| 美女999久久久精品视频| 日韩视频在线免费| 久久久精品国产一区二区三区| 亚洲福利专区| 国产精品电影网站| 久久久久久穴| 在线性视频日韩欧美| 久久躁日日躁aaaaxxxx| 一本色道综合亚洲| 国产一区欧美日韩| 欧美揉bbbbb揉bbbbb| 久久久久高清| 在线视频欧美精品| 欧美黄色一级视频| 欧美在线播放视频| 亚洲人成在线观看| 国产亚洲电影| 欧美视频专区一二在线观看| 久久精品亚洲一区| 中日韩美女免费视频网址在线观看| 久久香蕉国产线看观看网| 一区二区三区久久久| 精品91在线| 国产精品毛片| 欧美日韩一区二区欧美激情| 久久亚洲精品网站| 欧美一二三区在线观看| 一本色道88久久加勒比精品 | 欧美黄色视屏| 久久国产精彩视频| 亚洲视频日本| 亚洲激情偷拍| 欧美黑人在线播放| 久久婷婷一区| 久久久.com| 欧美一区日本一区韩国一区| 亚洲视频在线观看免费| 亚洲乱码一区二区| 亚洲国产黄色片| 在线播放日韩欧美| 狠狠色狠狠色综合系列| 国产欧美日韩综合一区在线播放| 欧美日韩少妇| 欧美激情一区二区三区 | 亚洲一二三区视频在线观看| 亚洲人成77777在线观看网| 欧美成人免费va影院高清| 久久大香伊蕉在人线观看热2| 亚洲欧美日韩一区二区| 亚洲综合第一| 性色av香蕉一区二区| 亚洲欧美日韩精品久久亚洲区| 国产精品99久久久久久宅男| 亚洲视频在线观看免费| 亚洲在线一区| 欧美亚洲日本国产| 久久精品91| 男女视频一区二区| 欧美国产日韩一区| 亚洲精品日韩在线观看| 一区二区激情视频| 亚洲在线成人精品| 久久精品国产999大香线蕉| 久久免费视频观看| 欧美激情中文字幕乱码免费| 欧美日韩亚洲国产精品| 国产精品国产三级国产| 国产色爱av资源综合区| 一区二区在线观看视频| 亚洲精品你懂的| 亚洲综合三区| 久久精品国产91精品亚洲| 欧美凹凸一区二区三区视频| 亚洲激情视频在线观看| 亚洲午夜精品福利| 久久久久国产精品麻豆ai换脸| 欧美成人综合网站| 国产精品视频内| 在线观看免费视频综合| 一本色道综合亚洲| 久久九九国产精品怡红院| 亚洲成色777777在线观看影院| 国产一级精品aaaaa看| 国内激情久久| 国产精品99久久久久久宅男| 久久黄色小说| 亚洲人成网站在线观看播放| 亚洲欧美日韩成人| 欧美国产精品va在线观看| 国产精品美女久久久| 亚洲福利视频免费观看| 亚洲欧美另类中文字幕| 欧美国产高清| 欧美一级久久久久久久大片| 欧美精品1区2区| 国内精品美女在线观看| 亚洲私拍自拍| 亚洲电影在线| 亚欧成人精品| 欧美午夜免费影院| 亚洲精选成人| 女仆av观看一区| 亚洲欧美第一页| 欧美日韩免费观看一区三区 | 亚洲欧洲日产国码二区| 欧美激情一区二区三级高清视频| 国产精品欧美日韩久久| 日韩午夜在线观看视频| 你懂的国产精品| 午夜视频精品|