Professional Documents
Culture Documents
lo
gi
các hệ thống đầu cuối
ca
le
Phía gửi: chia nhỏ các thông điệp
nd
en-
(message) ứng dụng thành các
d
tr a
segments, sau đó chuyển các
ns
segments này cho tầng Mạng
po
rt
Phía nhận: tái kết hợp các
segments thành các thông điệp application
transport
(message), các thông điệp này network
data link
được chuyển lên tầng Ứng dụng physical
lo
data link physical
gi
physical
Điều khiển luồng
ca
network
le
data link
nd
Thiết lập kết nối physical
-en
network
d
Không tin cậy, truyền
tra
data link
physical
ns
không theo thứ tự: UDP
po
network
rt
data link
physical
Không rườm rà, “nỗ lực network
data link application
application
application P1 application
P3 P4
transport
transport transport
network
network link network
link physical link
physical physical
application
application P4 P5 P6 application
P3 P2 P3
transport
transport transport
network
network link network
link physical link
physical server: physical
địa chỉ
IP B
bit dư 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1
tổng 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0
checksum 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1
Lưu ý: khi cộng các số, bit nhớ ở phía cao nhất cần
được thêm vào kết quả
Các đặc điểm của kênh truyền không tin cậy sẽ xác định sự phức tạp của giao thức truyền
dữ liệu (data transfer protocol) (rdt)
Các đặc điểm của kênh truyền không tin cậy sẽ xác định sự phức tạp của giao thức truyền
dữ liệu (data transfer protocol) (rdt)
Các đặc điểm của kênh truyền không tin cậy sẽ xác định sự phức tạp của giao thức truyền
dữ liệu (data transfer protocol) (rdt)
rdt_send(): được gọi bởi tầng trên, deliver_data(): được gọi bởi rdt để
(tầng Ứng dụng). Chuyển dữ liệu cần chuyển dữ liệu đến tầng cao hơn
truyền đến tầng Ứng dụng bên nhận
Bên Bên
gửi nhận
udt_send(): được gọi bởi rdt, để rdt_rcv(): được gọi khi gói dữ liệu
truyền các gói trên kênh không tin đến kênh của bên nhận
cậy đến nơi nhận
udt_send(packet)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Chờ gọi Chờ ACK rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
từ tầng trên hoặc NAK udt_send(sndpkt)
udt_send(NAK)
Bên gửi
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Chờ gọi Chờ ACK rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
từ tầng trên hoặc NAK udt_send(sndpkt)
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Chờ gọi Chờ ACK rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
từ tầng trên hoặc NAK udt_send(sndpkt)
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Wait for ACK Wait for
or NAK 1 call 1 from
rdt_rcv(rcvpkt) && above
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt) udt_send(sndpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq1(rcvpkt))
Wait for
0 from receiver FSM
udt_send(sndpkt)
below
fragment
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt)
(c) Mất ACK (d) Thời gian chờ quá ngắn / delayed ACK
L 8000 bits
Dtruyền = R = = 8 microsecs
109 bits/sec
U sender : utilization – khoảng thời gian mà bên gửi gửi được dữ liệu
U L/R .008
sender = = = 0.00027
RTT + L / R 30.008
Nếu RTT=30 msec, gói 1KB mỗi 30 msec: thông lượng 33kB/sec trên đường link 1Gbps
Giao thức mạng hạn chế việc sử dụng các tài nguyên vật lý!
U L/R .008
sender = = = 0.00027
RTT + L / R 30.008
U 3L / R .0024
sender = = = 0.00081
RTT + L / R 30.008
ACK(n): thông báo nhận tất cả các packet lên đến n, bao gồm n số thứ tự - “ACK tích
lũy”(“cumulative ACK”)
Có thể nhận ACK trùng (xem bên nhận)
Định thì cho packet sớm nhất đang trong tiến trình xử lý (oldest in-flight pkt)
timeout(n): truyền lại packet n và tất cả các packet có số thứ tự cao hơn trong cửa sổ (window)
base=1
nextseqnum=1
timeout
start_timer
Wait
udt_send(sndpkt[base])
udt_send(sndpkt[base+1])
…
rdt_rcv(rcvpkt) udt_send(sndpkt[nextseqnum-1])
&& corrupt(rcvpkt)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
base = getacknum(rcvpkt)+1
If (base == nextseqnum)
stop_timer
else
start_timer
udt_send(sndpkt) rdt_rcv(rcvpkt)
&& notcurrupt(rcvpkt)
&& hasseqnum(rcvpkt,expectedseqnum)
Wait
extract(rcvpkt,data)
expectedseqnum=1 deliver_data(data)
sndpkt = sndpkt = make_pkt(expectedseqnum,ACK,chksum)
make_pkt(expectedseqnum,ACK,chksum) udt_send(sndpkt)
expectedseqnum++
ACK-duy nhất: luôn luôn gửi ACK cho gói đã nhận chính
xác, với số thứ tự xếp hạng cao nhất (highest in-order
seq #)
Có thể sinh ra các ACK trùng nhau
Chỉ cần nhớ expectedseqnum
Packet không theo thứ tự(out-of-order pkt):
hủy (discard): không giữ trong bộ đệm bên nhận!
Gửi lại ACK với số thứ tự xếp hạng cao nhất
Tầng Transport 3-49
Hoạt động GBN
sender window (N=4) bên gửi bên nhận
012345678 send pkt0
012345678 send pkt1
send pkt2 receive pkt0, send ack0
012345678
send pkt3 Xloss receive pkt1, send ack1
012345678
(wait)
receive pkt3, discard,
012345678 rcv ack0, send pkt4 (re)send ack1
012345678 rcv ack1, send pkt5 receive pkt4, discard,
(re)send ack1
ignore duplicate ACK receive pkt5, discard,
(re)send ack1
pkt 2 timeout
012345678 send pkt2
012345678 send pkt3
012345678 send pkt4 rcv pkt2, deliver, send ack2
012345678 send pkt5 rcv pkt3, deliver, send ack3
rcv pkt4, deliver, send ack4
rcv pkt5, deliver, send ack5
timeout
X
Truyền lại pkt0 X
0123012 pkt0
Sẽ chấp nhận packet
với số thứ tự 0
(b) Lỗi!
Tầng Transport 3-55
Chương 3 Nội dung
3.1 các dịch vụ tầng 3.5 vận chuyển hướng
Vận chuyển kết nối: TCP
3.2 multiplexing và Cấu trúc segment
demultiplexing Truyền dữ liệu tin
cậ y
3.3 vận chuyển phi
Điều khiển luồng
kết nối: UDP (flow control)
3.4 các nguyên lý Quản lý kết nối
truyền dữ liệu tin
3.6 các nguyên lý về
cậy
điều khiển tắc nghẽn
3.7 điều khiển tắc
nghẽn TCP
Tầng Transport 3-56
TCP: tổng quan RFCs: 793,1122,1323, 2018, 2581
point-to-point: Dữ liệu full duplex:
Một bên gửi, một bên nhận Luồng dữ liệu đi 2 chiều
Tin cậy, luồng byte theo trong cùng 1 kết nối
thứ tự (in-order byte MSS: kích thước tối đa của
gói tin (maximum segment
steam): size)
Không “ranh giới thông
điệp” (“message
Hướng kết nối:
boundaries”) Bắt tay (trao đổi các thông
điệp điều khiển) khởi tạo
pipelined: trạng thái bên gửi và nhận
Điều khiển luồng và tắc trước khi trao đổi dữ liệu
nghẽn của TCP thông qua
việc thiết lập kích thước
Điều khiển luồng:
cửa sổ (window size) Bên gửi sẽ không làm tràn
bộ đệm bên nhận
User
Nhập
‘C’
Seq=42, ACK=79, data = ‘C’
host báo nhận thành công ‘C’,
phản hồi ngược lại ‘C’
350
300
250
RTT (milliseconds)
200
sampleRTT
150
EstimatedRTT
100
1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106
time (seconnds)
Tầng Transport 3-62
time (seconds)
SampleRTT Estimated RTT
TCP round trip time và timeout
Khoảng thời gian timeout (timeout interval):
EstimatedRTT cộng với “biên an toàn”
Sự thay đổi lớn trong EstimatedRTT -> an toàn biên lớn hơn
Ước lượng độ lệch SampleRTT từ EstimatedRTT:
DevRTT = (1-)*DevRTT +
*|SampleRTT-EstimatedRTT|
(typically, = 0.25)
if (y > SendBase) {
SendBase = y
/* SendBase–1: last cumulatively ACKed byte */
if (there are currently not-yet-acked segments)
start timer
else stop timer
} Tầng Transport 3-67
TCP: tình huống truyền lại
Host A Host B Host A Host B
SendBase=92
Seq=92, 8 bytes of data Seq=92, 8 bytes of data
timeout
ACK=100
X
ACK=100
ACK=120
SendBase=120
X
ACK=120
segment đến theo thứ tự với số Lập tức gởi lại một ACK tích lũy, thông báo
thứ tự mong muốn. 1 segment nhận thành công cho cả segment theo thứ
khác có ACK đang treo tự
Segment đến không theo thứ tự Lập tức gởi lại ACK trùng, chỉ ra số thứ tự
với số thứ tự lớn hơn số được của byte được mong đợi kế tiếp
mong đợi. Có khoảng trống
segment đến lắp đầy từng phần Lập tức gửi ACK, với điều kiện là segment
hoặc toàn bộ khoảng trống đó bắt đầu ngay điểm có khoảng trống
ACK=100
timeout
ACK=100
ACK=100
ACK=100
Seq=100, 20 bytes of data
IP
Điều khiển luồng code
bên nhận kiểm soát bên gửi, để
bên gửi sẽ không làm tràn bộ
nhớ đệm của bên nhận bởi từ bên gửi
truyền quá nhiều và quá nhanh Chồng giao thức bên nhận
application application
network network
choose x
req_conn(x)
ESTAB
acc_conn(x)
ESTAB
choose x choose x
req_conn(x) req_conn(x)
ESTAB ESTAB
retransmit acc_conn(x) retransmit acc_conn(x)
req_conn(x) req_conn(x)
ESTAB ESTAB
data(x+1) accept
req_conn(x)
retransmit data(x+1)
data(x+1)
connection connection
client x completes server x completes server
client
terminates forgets x terminates forgets x
req_conn(x)
ESTAB ESTAB
data(x+1) accept
Kết nối mở một nửa! data(x+1)
(không có client!)
Tầng Transport 3-79
TCP bắt tay 3 lần (3-way handshake)
closed
Socket connectionSocket =
welcomeSocket.accept();
Socket clientSocket =
SYN(x) newSocket("hostname","port
number");
SYNACK(seq=y,ACKnum=x+1)
Tạo socket mới để giao tiếp listen SYN(seq=x)
ngược lại với client
SYN SYN
rcvd sent
SYNACK(seq=y,ACKnum=x+1)
ESTAB ACK(ACKnum=y+1)
ACK(ACKnum=y+1)
LAST_ACK
FINbit=1, seq=y
TIMED_WAIT Có thể không còn
gửi dữ liệu
ACKbit=1; ACKnum=y+1
Thời gian chờ tối đa
bằng 2 lần thời gian CLOSED
sống của segment
CLOSED
R/2
delay
out
Host A
out
Bên gửi chỉ gửi khi bộ nhớ
đệm của router sẵn sàng
in R/2
A
free buffer space!
A
Không còn bộ nhớ đệm!
Host B
Tầng Transport 3-89
Nguyên nhân/Hệ quả của tắc nghẽn:
tình huống 2
Lý tưởng hóa: các packet có thể R/2
bị mất hoặc bị loại bỏ tại
router bởi vì bộ nhớ đệm bị Khi gửi tại R/2, một
số packet được
đầy
out
truyền lại, nhưng
Bên gửi chỉ gởi lại các gói đã tiệm cân goodput
vẫn là R/2 (tại sao?)
bị mất
in R/2
A
Không còn bộ nhớ đệm!
Host B
Tầng Transport 3-90
Nguyên nhân/Hệ quả của tắc nghẽn:
tình huống 2
Thực tế: trùng lặp R/2
Các packet có thể bị mất , bị bỏ
Khi gửi tại R/2, một
tại router bởi vì bộ nhớ đệm đầy số packet được
out
Thời gian time out bên gửi hết truyền lại, bao gồm
packet bị trùng đã
sớm, gởi 2 bản giống nhau, cả 2 được gửi đi!
đều được gửi đi R/2
in
in
timeout
copy out
'in
A
Không còn bộ nhớ đệm!
Host B
Tầng Transport 3-91
Nguyên nhân/Hệ quả của tắc nghẽn:
tình huống 2
Thực tế: trùng lặp R/2
Các packet có thể bị mất , bị bỏ
tại router bởi vì bộ nhớ đệm đầy Khi gửi tại R/2, một
số packet được
out
Thời gian time out bên gửi hết truyền lại, bao gồm
sớm, gởi 2 bản giống nhau, cả 2 packet bị trùng đã
được gửi đi!
đều được gởi đi
in R/2
Host D
Host C
in’ C/2
AIMD saw tooth (thì giảm một nữa kích thước cửa sổ)
cwnd: TCP sender
behavior: thăm dò
băng thông
RTT
đầu tiên xảy ra:
initially cwnd = 1 MSS two segm
ents
Gấp đôi cwnd mỗi RTT
Được thực hiện bằng
cách tăng cwnd cho mỗi four segm
ents
ACK nhận được
Tóm lại: tốc độ ban đầu
chậm, nhưng nó sẽ tăng
lên theo cấp số nhân time
Thực hiện:
ssthresh thay đổi
Khi mất gói, ssthresh được
thiết lặp về chỉ 1/2 của
cwnd trước khi mất gói
3 W
avg TCP thruput = bytes/sec
4 RTT
W
W/2
Router cổ chai
Khả năng R
Kết nối TCP 2
Connection 1 throughput R
Tầng Transport 3-108
Công bằng (tt)
Công bằng và UDP Công bằng, các kết nối TCP
Nhiều ứng dụng song song
thường không dùng ứng dụng có thể mở nhiều