Transport layer
2025. 11. 25. 23:43ㆍNetwork
반응형

RTT (왕복 시간)
전송 속도 R (초당 전송 가능한 비트 수)
패킷 길이 L (전송해야할 총 비트 수)
- 송신자의 효율이 0.00027로 왕복 시간이 길수록 효율이 낮아짐
- l / r : 몇 초동안 전송해야 이 비트들을 보낼 수 있는지 시간이 나옴
piplined protocols
- 한번 패킷을 보낼 때, 여러 개를 보내서 한번에 여러개의 응답을 받을 수 있게 하는 것
- go-back N protocols
go-back N protocol
- 윈도우 사이즈로 조절하면서 여러 개의 패킷을 보낼 수 있으나 패킷 유실 발생이나 패킷 오류 발생 시 윈도우 사이즈만큼 바퀴를 돌아야하는 문제가 발생
- sender
- window size를 보고 그 사이즈만큼 패킷 여러 개 전송
- 각각의 패킷을 보내고 나서 응답에 대한 timer가 존재
- receiver
- 여러 개의 패킷이 들어올 때 순서대로 들어온다는 보장이 없음
- 그래서 처음에 0번 패킷 받고 그 다음으로 1번 패킷을 받아야하는데 2번 패킷 먼저 오면 3번 패킷 버리고 1번 받고 ack 1보내고 2번 기다리는데 아까 2번 버려서 3번 패킷이니까 3번 버리고 이런식으로 패킷이 밀려버림
- 리시버 측에서 6번이 패킷 유실 확인되면 window size가 4일 때 4개짜리를 한바퀴 더 돌고 가야하는 셈임
- 0123 1234 2345 3456 4567 5678 6789 6789(6번 패킷이 없어서 ack 못보내니까 나머지 뒤에 있는 패킷을 다 버리기 때문에 한바퀴 더 도는 것임) 78910
selective repeat
- sender
- 윈도우 사이즈 크기만큼 보낸 패킷 별로 타이머 존재하고 해당 타이머 시간안에 들어온 ack 메시지 패킷은 다시 보내지 않음 (타이머 소멸)
- 앞서 2, 3번 패킷중 3번 패킷이 먼저 들어오게 된다면 해당 3번 패킷에 대한 타이머는 소멸. 2번 패킷에 대한 타이머는 터짐 → 그럼 재전송을 함
- 송신측 버퍼에서 ack메세지가 잘 도착한 패킷은 삭제
- receiver
- 윈도우 사이즈 크기만큼의 버퍼를 만들어 어떤 패킷이 정상적으로 들어왔는지 적어둠
시퀀스 넘버의 크기 문제
- sender에서의 윈도우 사이즈 크기에 맞춰 패킷을 보냈는데 윈도우 사이즈 크기만큼 시퀀스 넘버를 정한 경우 ex) win = 3, seq length = 3
- 0번 패킷이 다음 패킷에 대한 0번 시퀀스 넘버를 뜻하는데 리시버는 새로운 패킷이라 생각하고 버퍼에 저장해두게 되는 문제 발생
- 시퀀스 넘버를 키우면 되는 문제이지만 최소한으로 해야함
TCP
- 특징
- 데이터를 주고받는 소켓은 두 곳 모두 리시버이자 센더의 역할을 할 수 있음
- 즉 각 프로세스별로 샌더 버퍼, 리시버 버퍼가 존재하는 것
- 프로세스와 프로세스 간의 통신을 하는데 프로세스에서 여러 포트를 열어 소켓을 생성할 수 있으나 그 중에서도 하나의 포트를 열어서 소켓을 연결해 사용하는 방식임
- Go-back N과 다르게 seq 넘버는 sender기 리시버한테 보낼때 몇번째를 보내야하는지 기억하는 것이고 ack은 샌더가 리시버한테 어디까지 받았다를 의미하는데 go-back은 ack를 받은 번호를 보내두는데 tcp는 받을 번호를 얘기함 9번까지 받앗으면 10번 보내는거임
- Timeout : rtt 를 기준으로 사용하려 했으나 네트워크 상황, 세그먼트별로 도착하기까지 돌아다니는 길 등이 천차만별이라 시간차가 큼.. 따라서 sample rtt(각 세그먼트 별로 측정된 시간) 에 estimated rtt에 0.12값의 가중치를 둬서 계산을 해 구한다 (중요하지 않음)
- 시퀀스 뭉탱이로 보내는거 한 뭉탱이 당 타이머 하나가 됨 go-back 같은 경우에는 윈도우 사이즈 내부 하나에 여러개 타이머 존재하나 tcp에서는 세그먼트 뭉탱이 별로 한개 존재
- 따라서 뭉탱이 시간 끝날 시 뭉탱이를 다시 보냄
- cumulation ack : 뭉탱이로 받은 패킷의 마지막 ack만 보내기
- 데이터를 주고받는 소켓은 두 곳 모두 리시버이자 센더의 역할을 할 수 있음
- timeout이 터지기 전에 패킷 유실을 확인할 방법?
- 세그먼트 100개를 순서대로 보넀을 때 10번 유실이면 ack9 다음 ack10 ack10 ack10 달라고 계속 보낼거임 receiver의 버퍼에 10번빼고 나머지는 쌓여있는 상태.
- fast retransmit : 따라서 ack10 여러 번 날라오면 결국 timer 터지기 전에 패킷 유실을 알아낼 수 있음
- fast retransmit은 있어도 되고 없어도 되고, timer는 무조건 있어야하는것
- 3 dup (duplicate)
- 총 ack 3번 반복, 첫번째 ack는 빼고 3번 반복이라 결국 총 합은 4번 반복임!!!!!!!!!
- 3 dup (duplicate)
- fast retransmit은 있어도 되고 없어도 되고, timer는 무조건 있어야하는것
TCP FLOW CONTROL
- 각 통신 프로세스는 send buf, recv buf를 가짐
- send buf는 recv buf가 감당할 수 있는 만큼 조절해서 보내야 함
- recv buf는 받은 것을 application으로 올려줌
- 따라서 receiver는 header에 recv buffer size를 같이 보내줌
- receive buffer size: 현재 얼마만큼 자리가 있는지 버퍼 남은 공간 수 알려주기
- send 측은 reciever가 패킷을 보내지 않으면 알 방법이 없으니, sneder측에서 data 는 비어있는 패킷을 막 보냄 그럼 reciever측에서 해당 패킷에 대한 응답값을 보내니 그때 확인이 가능
3way handshake
- tcp header에 연결하고자 하는 곳에 패킷을 보내는데 나의 seq 번호와 SYN를 1로 설정 ( 패킷 통신일 때는 0을 유지하나 tcp 열고 닫을 때 1로 변경)
- SYN/ACK를 보내고 시퀀스 번호 y 보냄
- ACK를 보냄 (데이터를 포함해서 보냄)
closing TCP Connection
- client측에서 보낼 데이터를 다 보냈다는 의미로 FIN 보냄
- Server측에서 ack받고 서버측에서 데이터 다 받고 정리되면 FIN 보냄
- clinet는 fin을 받았다고 ack를 보내야함
- ack를 안보내면 server측은 계속해서 fin을 보내게 됨
congestion control, flow control 중 더 상태가 안좋은 곳에 맞춰서 sender는 데이터를 보내야하는 것임
congestion control
- 인터넷 네트워크는 많은 컴퓨터들이 사용중인 공공의 개체임. 각각의 pc들은 데이터를 많이 받기를 원함.
- 네트워크가 계속해서 막히면 데이터를 계속 보내고 그럼 더 막히게 됨
- 따라서 각자 자신을 위해서 데이터 양을 줄여서 보내기로 함
congestion control 해결 방법
- router가 sender측에 네트워크 상황을 피드백해서 줌 (사용 안함)
- tcp의 세그먼트를 보냈을 때, ack의 상태를 빨리 피드백이 오는지, 유실되는지를 보면서 네트워크 상태를 알아서 잘 유추하는 것
- Slow Start : 네트워크 망은 다같이 쓰는 곳이기 때문에 유추하기 위해서 마구 데이터를 쏟아부으면 안되고 작은 양만 보내서 네트워크 상황을 확인함
- 처음은 겸손하게 1개였다가 2개,3 , 4개 이렇게 증가시키면 100000개를 어느새월에 보냄. 그러니까, 기하급수적으로 늘리는 것임 1,2,4,8,16 이런식으로 보냄
- 따라서 실제로는 slow하지 않고 빠름
- Additive increase : 어느 지점을 지나는 순간 linear하게 보냄 조금씩 늘림 1,2,3 (window size 조절)
- multiplicative decrease : 뭔가 혼잡이 생겼을 때, 대폭 줄여야지 그 혼잡을 바로 잡을 수 있음 (절반 가까이)
- MSS (Maximum segement size ) : 500 byte
- slow start에서 데이터 갯수 늘리는 것으로 window size 한개당 1MSS에 해당하기 때문에, window size는 곧 한번에 마구 보낼 수 있는 세그먼트의 사이즈를 뜻함
- 전송 속도 : congestion window 사이즈가 결정함. 대략적인 속도는 congestion window size를 RTT로 나누면 됨
- Slow Start : 네트워크 망은 다같이 쓰는 곳이기 때문에 유추하기 위해서 마구 데이터를 쏟아부으면 안되고 작은 양만 보내서 네트워크 상황을 확인함
timeout, 3 dup ack 네트워크 상황 차이
- timeout 은 네트워크 매우 혼잡 상태, 3dup은 해당 패킷만 유실 된거기 때문에 빠른 회복으로 threashhold의 절반만 줄이고 linear하게 증가, timeout은 slow start부터 시작
- threashhold는 윈도우 사이즈의 절반으로 지정해둠
- Threshold의 값을 timeout이 발생한 cwnd의 절반으로 설정
tcp fairness
- 각 pc에 있는 tcp는 congestion avoidance를 피하기 위해 결국 어느 순간에는 1/2로 줄이고를 반복, 모든 pc가 동일 따라서 가운데에 수렴. 그래서 각 tcp를 하나씩만 열었을때는 공평하게 사용하는 상황이 됨
- 하지만 어느 한 컴터에서 tcp하나 더 열면 그때는 그 pc가 두배를 쓰는 거임
반응형
'Network' 카테고리의 다른 글
| Wireless Protocol (0) | 2025.11.25 |
|---|---|
| Data Link Layer (0) | 2025.11.25 |
| Transport Layer (0) | 2025.11.25 |
| socket (0) | 2025.11.25 |
| osi 7 layer, application layer (0) | 2025.11.25 |