- Internet
- Protocol
- Network간 전달 방식
- OSI Model
- Network 장비
- Mac 주소
- Port 주소
- TCP
- Full Name
- 계층
- Stream Delivery
- Buffer
- Numbering System
- ACK
- Segment Header Format
- Payload
- Connection Setup 과정 (3-way Handshake)
- Termination Setup 과정 (3-way Handshake)
- Data Transfer
- 전체 과정 Time-line
- Client
- Server
- Window
- Flow Control
- Silly Window Syndrom
- SYN Flooding
- 신뢰성 보장
- Fast Retransmission
- Lost Acknowledgement
- Congestion Control
- Congestion Avoidence
- TCP Fair
- Timer
- TCP Header Option
- UDP
- IPV4
- Delivery
- Web and Http
- IPv4
Internet
컴퓨터로 연결하여 TCP/IP Protocol이라는 통신 프로토콜을 이용해 정보를 주고 받는 컴퓨터 네트워크
Protocol
장치 간 통신을 위해 정해놓은 양식 및 규칙의 체계
Network간 전달 방식
Circuit Switching Network
중앙 제어 전달 방식
기차처럼 중앙에서 관리하는 방식
중앙에 문제가 생기면 모든 시스템에 영향이 감
전송 방법
Source to Destination으로 움직일 때 전체 메세지가 Packet들로 나뉘지 않고 전달됨
Packet Switching Network
목적지 주소 전달 방식
목적지만 정하고 경로 설정 X
=> Internet은 목적지 주소 전달 방식을 채택
전송 방법
메세지가, Packet들로 나뉘어져서 전송됐다가, Destination에서 다시 결합됨
TCP/IP의 전송방식
원래는 Connectionless Service를 기원으로 했으나, 최근에는 Connection-Oriented Service로 바뀌는 경향이 있음
OSI Model
Open System Interconnection
ISO에서 OSI를 만듦
OSI 7 Layer
1. Phyical Layer
단위
Bit
역할
Bit들을 전송 매체에 전기 신호로 바꾸어서 보내는 것, 인코딩 등 담당
2. DataLink Layer
단위
Frame
역할 및 기능
Hop to Hop Delivery를 진행
주소 제어
이 계층에서 데이터가 추가된 Frame의 Header에는 데이터가 지나온 노드와 다음 노드의 주소(Mac)가 포함됨
순서 제어
데이터를 순차적으로 전송하기 위해 프레임 번호 부여 기능 수행 및 수신 노드에서 식별 번호를 추가하여 프레임의 순서를 제어
흐름 제어
한 번에 전송할 수 있는 데이터의 양을 제어하며 연속으로 프레임을 존솔할 때 수신 여부를 확인한느 기능을 수행
오류 처리
체크섬 등의 에러 검출 기능과 에러 정정 기능을 수행하며 오류가 발생한 경우 프레임의 재전송을 요구할 수 있음
동기화
Frame의 헤더에는 수신 측의 Frame이 도착했음을 알리는 Bit가 존재하며, Trailer에는 에러를 제어하는 Bit와 Frame의 끝을 나타내는 Bit가 존재
Hop to Hop Delivery
Source to Destination으로 갈 때 한번에 가는 것이 아니라 중간 중간 여러 Network 장비들을 거쳐서 감
Mac주소 필요
3. Network Layer
단위
Datagram
역할 및 기능
Source to Destination 전달
IP 주소 필요
Routing을 통해 경로를 선택하여 전달
4. Transport Layer
단위
TCP : segment
UDP : userdatagram
역할
신뢰성이 보장되는 Process to Process Delivery를 진행,
Port 번호 필요
신뢰성이 보장되는 전송을 진행 (TCP, UDP)
Communication
Layer to Layer Communication
5. Session Layer
응용 프로그램 계층 사이의 접속을 설정, 유지, 종료하는 역할
사용자와 전송 계층 간의 인터페이스 역할
데이터 점검 및 복구하는 동기화 기능 제공
역할 및 기능
동기화
전송 계층으로 전송할 순서와 전송할 때 수신자 확인이 필요한 곳을 결정
세션 연결 설정 및 종료
세션 연결의 설정과 종료 및 관리 절차를 정의
대화 제어
누가 언제 보내는지를 결정
Communication
Layer to Layer Communication
6. Presentation Layer
데이터 표현의 차이를 해결하기 위해 다른 형식으로 변환하거나 공통 형식을 제공하는 계층
역할 및 기능
암호화
데이터의 보안을 위해 암호화와 복호화를 수행
압축
데이터의 효율적인 전송을 위해 데이터 압출 및 압축 해제를 수행
코드 변환
전송에 사용할 수 있도록 메시지(데이터)를 상호 간에 수용할 수 있는 형식으로 변환한 후 수신자에게 이해할 수 있는 형식으로 변환
Communication
Layer to Layer Communication
7. Application Layer
End System에서 실행되는 Application 계층 TCI/IP는 Session, Presentation, Application Layer를 합쳐서 Application으로 함
Communication
Layer to Layer Communication
Layer 존재 이유
분업 위해, 효율적으로 Protocol을 디자인 하기 위해서
만약 특정 계층의 구현이 변경되도 다른 계층에는 영향을 주지 않음
Network 장비
Router
Network와 Network를 연결하는 장비
Repeater
신호가 가다가 약해지면 데이터를 읽기가 어려움
=> 다시 신호를 증폭 시켜줌
HUB
Repeater와 동일한데, 포트(Output)가 여러개 있는 것
Bridge
예를 들어 10번 -> 50번으로 전송해야 할 때 모르면 다 보내야 하지만, 알고 있으면 굳이 다 보낼 필요 없이 50번에게만 보내면 됨
=> Bridge가 Filtering 해줌
Switch
Multi Port Bridge
위의 3개를 전부 처리함
Mac 주소
6byte의 12진수 값인 Physical Address
Local에서만 유일
Data를 Hop to Hop으로 전송을 할 때 Mac 주소는 과정을 거치면서 바뀌지만, Source와 Destination을 가리키는 IP는 바뀌지 않음
Port 주소
IP주소는 Computer에게 부여되는 번호, 전세계에 하나밖에 없는 주소
한 컴퓨터 안에서 여러 개의 Internet을 사용하는 Program이 실행될 수 있음
각 Program마다 Port 번호를 할당하여 원하는 Program과 통신할 수 있도록 하는 것
16bit를 가지며, 10진법으로 표현함
TCP
Full Name
Transmission Control Protocol
계층
Transport Layer
Stream Delivery
Application에서 생성된 메세지를 적당한 Byte 단위로 끊어서 보내는 것
Buffer
송신자와 수신자별로 각각의 송신 버퍼, 수신 버퍼가 존재
송신 버퍼에서 상대에게 보냈다고 바로 비우지 않음
상대가 못받았을 경우 재전송을 해주기 위함 (Sent 영역)
Numbering System
TCP에서 보내는 데이터마다 숫자를 붙힘
최초 시작 번호는 랜덤이며, 데이터들의 번호는 Segment의 첫번째 데이터의 Byte 번호
=> Sequence Number
ACK
패킷을 잘 수신했다는 것을 보내는 것
ACK에 대한 ACK은 없음 (ACK이 잘 갔는지 확인할 방법 X)
종류
Selective ACK
넘겨받은 Sequence Number를 ACK으로 넘기는 방법
Cumulative ACK
앞으로 받고 싶은 Sequence Number를 ACK으로 넘기는 방법
=> TCP/IP 방식
Segment Header Format
종류
Source Port Address
Source Port를 가리키는 16bit
Destination Port Address
Destination Port를 가리키는 16bit
Sequence Number
자신의 Sequence Number를 가리키는 32bit
Acknowledgement Number
수신했다는 것을 알려주기 위한 ACK 번호가 적힌 32bit
HLEN
가변적인 Header의 길이를 알려주기 위한 4Bit
Header는 20~60Byte의 크기를 가지는데, 4Bit로는 15까지 표현 가능
=> 계산한 값 * 4가 진짜 Header의 크기가 됨
Reserved
처음 Design한 구조만으로는 안될 수 있어서 마련해 둔 추가적인 6 Bit
URG, ACK, PSH, RST, SYN, FIN
URG
Urgent Pointer가 유효하다는 1Bit
ACK
ACK 번호에 유효한 Data를 실어서 보내는 것이므로 확인하라는 1Bit
PSH
Push 요청 1Bit
RST
연결 리셋 1Bit
처음에 연결 시 연결 거절을 할 때, 종료할 때 Time Wait 없이 바로 종료할 때 사용
SYN
연결 요청 1Bit
FIN
연결 종료 1Bit
Window Size
Receiving Buffer의 남은 공간을 알려주는 16Bit
CheckSum
패킷들이 전송되다가 물리적으로 Bit들이 바뀌는 등의 오류를 확인하기 위한 16bit
CheckSum을 제외한 나머지를 16Bit씩 끊어서 다 더했을 때 나오는 값의 보수를 취한 값
TCP에서는 Checksum이 의무 (UDP는 Option)
Urgent Pointer
16bit
Options and Padding
추가적으로 필요한 내용들이 있을 시 사용
Payload
Segment, Frame 등에서 자신의 Header를 제외한 Data부분을 지칭
Connection Setup 과정 (3-way Handshake)
Server 실행
Client에서 Server로 SYN Bit를 1로 설정한 연결 요청 패킷 보냄 (SYN)
Server에서도 Client에게 SYN Bit를 1로 설정 및 Client가 보낸 요청을 읽었다는 ACK (Client가 보낸 패킷의 Sequence Number + 1)을 넣어서 보냄 (SYN + ACK)
Client가 Server가 보낸 요청을 읽었다는 ACK (Server가 보낸 패킷의 Sequence Number + 1)을 서버에게 보냄 (ACK)
Termination Setup 과정 (3-way Handshake)
- Client에서 Fin이 설정된 패킷 보냄
- Server에서 수신했다는 ACK + FIN이 설정된 패킷 보냄
- Client에서 수신했다는 ACK 보냄으로써 연결 종료
Server는 각 Client마다 버퍼를 만들기 때문에 종료할 때 확실히 해서 버퍼를 없애는 과정 필요하기 때문
Half Close
일반적으로 Server는 계속해서 대기하고, Client 쪽에서 먼저 종료 요청을 보냄
이 때 무조건적으로 Server에서 FIN + ACK을 보내는 것은 아니고, 만약 더 보내야 할 Data가 남았다면 마저 보낸 다음에 다 보내고 나서야 FIN + ACK을 보내게 됨
이처럼 한쪽은 FIN을 보내고 다른 한 쪽은 아직 FIN을 보내지 않아 완전히 종료가 되지 않은 상태를 Half-Close라고 함
Data Transfer
데이터를 계속해서 보냄
수신하는 사람은 하나의 패킷이 올 때마다 ACK을 계속해서 보낼 필요 없이, 예를 들어 1~2 데이터가 담긴 패킷을 받고 3~4가 담긴 패킷을 잘 받았다면 ACK을 5로 해서 보내면 됨
만약 중간에 안받아진 것이 있다면 그걸 ACK으로 설정해서 다시 받으면 됨
Normal Operation
ACK의 갯수를 줄여보고자 위한 RULE
규칙
- Data를 받아서 ACK을 보낼 때, Buffer에서 보낼 것이 있는지 확인 후 보낼 데이터가 있으면 같이 보내기
- 데이터를 받아서 ACK을 보낼 때 보낼 데이터가 없으면 바로 ACK을 보내지 말고 50ms 만큼을 기다렸다가 그럼에도 데이터가 없으면 그때서야 ACK을 보내기
- Rule 2에 의해 기다리고 있는 도중 또 다른 패킷이 들어오면 그때는 더이상 기다리지 말고 ACK을 보내기
- 패킷 로스가 일어나는 등 긴급 상황이 일어났을 땐 ACK을 아끼지 말고 바로 보내기 (RTO가 다 지나면 패킷 로스로 간주)
- 못받았던 패킷을 받으면 바로 ACK을 보내기
- 중복된 데이터를 받아도 바로 ACK을 보내기
전체 과정 Time-line
Client
SYN-SENT
SYN을 Server에 보내고 SYN + ACK을 기다리는 구간
ESTABLISHED
Server로부터 SYN + ACK을 받아서, ACK을 보낸 후 FIN을 보내기 전까지의 구간
본격적으로 Data Transfer가 일어나는 구간
FIN-WAIT1
Server로 FIN을 보내고 ACK을 기다리는 구간
이 때 Server에서 아직 못 받은 데이터를 받을 수 있음
FIN-WAIT2
Server로부터 FIN이 오기를 기다리는 구간
만약 FIN-WAIT1 상태에서 Server에서 바로 FIN + ACK을 보냈을 경우 FIN-WAIT2 상태 없이 TIME-WAIT으로 전환
TIME-WAIT
ACK을 보내고 잠시 대기하는 구간
만약 RST + ACK을 보냈을 경우 TIME-WAIT 없이 바로 종료됨
MSL
Maximum Segment Life
필요한 이유
마지막으로 보낸 ACK이 제대로 전송되지 않았을 경우를 대비하는 것
만약 Server측에서 ACK을 받지 못하면, 문제가 있다고 생각하고 다시 FIN을 전송함
하지만 TIME-WAIT 상태가 없다면 Client는 이미 ACK을 보낸 후 종료헸으므로, 응답을 받지 못함
TIME-WAIT 없이 종료 후 이전 데이터가 넘어오는 것을 대비하는 것
TIME-WAIT이 없이 바로 종료가 된 후 모종의 이유로 다시 연결을 할 때, 만약 같은 PORT로 연결이 될 때,
만약 이전 연결 중에 돌아다니던 DATA가 바로 수신되지 않고 DATA가 어디서 헤매면서 돌아다니다가, 새로 연결되고 나서야 도착을 해버리면, 받는 입장에서는 과거의 것인지 지금 요청한 것인지 구분이 어려움
이것을 구분하기 위해 종료 후에도 바로 닫지 않고 일정 시간 대기했다가 종료함
(DATA가 Network 상에서 체류하는 시간이 일정시간 이상 넘어가면 소멸됨)
Server
Listen
Client가 연결 요청이 오기를 기다리는 구간
SYN-RCVD
Client로부터 SYN 요청을 받아서, SYN + ACK을 전송하고 ACK가 오기를 기다리는 구간
ESTABLISHED
Client로부터 SYN을 받고 본격적으로 Data Transfer가 일어나는 구간
CLOSE-WAIT
Client에게 FIN 요청에 대한 ACK을 보낸 뒤 FIN을 보내기 전까지의 구간
아직 보내야 할 데이터가 남았다면 이 때 마저 보냄
LAST-ACK
Client에게 FIN을 보내고 ACK을 기다리는 구간
Window
Data Transfer시 Data를 보내고, 그것에 해당하는 ACK을 받고 하는 식으로 하면 신뢰성 있고, 간단하지만, ACK을 Sender가 받을 때까지 Data를 보내지 않고 기다리므로 비효율적임
=> 한꺼번에 보내는게 효율적임 => Window (Byte 단위 크기를 가짐)
Sender와 Receiver 모두 Window가 존재
Sender쪽의 Window는 ACK을 받지 않아도 보낼 수 있는 Data의 크기
Sender의 Window 내에는 보냈지만 아직 ACK이 오지 않은 Outstanding Bytes와 아직 보낼 수 있는 여유 공간이 존재
Receiver에게서 ACK과 RWND 사이즈를 받으면, 그 크기를 바탕으로 계속해서 Window 사이즈를 수정
Receiver는 아직 처리되지 않은 Data와, 받을 수 있는 여유 공간이 존재
Window에는 Sender가 보낼 수 있는 양 (cwnd)와 Receiver가 받을 수 있는 양 (rwnd) 이 있고 Window 사이즈는 이 둘 중 작은 값으로 결정됨
Flow Control
처음에 연결되고 보낼 때, 상대가 받을 수 있는 Buffer의 공간만큼 Data를 보내는데, 이 정보는 Connection을 할 때, 상대가 보낸 패킷의 Window Size를 보고서 알 수 있음 (rwnd)
Silly Window Syndrom
정의
보내는 데이터에 비해서 헤더의 크기가 큰 경우, 비효율적임
송신 측에서는 보낼 데이터가 조금씩 들어올 경우 신드롬 발생
수신 측에서는 데이터 처리가 조금씩만 되서 버퍼 내 공간이 조금만 남을 경우 발생
Nagle 알고리즘
송신 측 해결책
첫번째 데이터는 사이즈와 상관 없이 그냥 보내고, 그 패킷에 대한 ACK이 올 때까지는 데이터를 모으면서 계속 기다림
만약 MSS(Maximum Segment Size)만큼 모이면 바로 발송
만약 ACK이 왔으면 데이터가 적더라도 발송
Clark 알고리즘
수신 측 해결책
MSS만큼 비거나, 버퍼 크기의 절반이 비었을 때만 ACK을 전송하면서 정상적인 윈도우 크기 응답을 보내주고, 아니면 0으로 보냄
확인 응답의 지연
수신 측 해결책
ACK 자체를 보내지 않음
일정 크기 이상의 빈 공간이 생겼을 때 ACK을 보내고, 공간이 비기 전까지는 ACK을 보내지 않음
=> 송신 측에서도 rwnd 만큼 계속 보낸 뒤, ACK이 오지 않으므로 더 이상 보내지 않고 대기
SYN Flooding
Server는 Client에게서 연결 요청이 오면 연결 요청 대기 큐에 적재한 다음, 하나씩 꺼내서 새로운 소켓을 만들어서 연결을 함
Client가 악의적으로 보내는 쪽의 IP or Port 번호를 바꾸어서 SYN을 보낸 뒤 Server의 SYN + ACK을 받고서 ACK을 보내지 않음으로써 연결 요청 대기 큐가 꽉 차서 정상적인 사용자가 연결을 제대로 하지 못하게 끔 하는 것
=> DoS(Denial of Service) => 이것을 여러 기기에서 하면 DDos (Distributed Denial of Service)
신뢰성 보장
손실 났거나 순서가 바뀌는 등 이상한 것은 주지 않고, 정상인 것만 TCP가 보내줌
Fast Retransmission
만약 3개의 중복된 ACK이 연속으로 오면, RTO Timer의 시간이 다 되지 않아도 패킷 로스로 간주하고 다시 보냄
Lost Acknowledgement
중간에 ACK이 없어져도 그 다음번 ACK을 통해 문제 없이 진행할 수 있음
But Clark 해결책 or 진짜로 Window size가 0 이어서 window를 0으로 한 패킷을 보낸 이후, 다시 여유가 생겨서 rwnd를 설정해서 ACK을 보냈는데, 이게 손실되면, Sender 쪽에서는 rwnd가 0이니까 계속해서 기다리고, Receiver 쪽에서는 크기를 설정한 rwnd를 보냈으니까 값이 오길 기다리면서 서로 교착이 생길 수 있음
해결책
Persistence Timer
교착 상태를 해결하기 위하여 사용
영속 타이머가 만료되면 probe 세그먼트 전송
=> 작은 사이즈의 데이터를 보내보는 것
=> 이를 통해 상대방의 응답이 올 것이므로
=> 만약 rwnd가 0이 아닌 값으로 오면 다시 보내기 시작하면 되고, 0이면 기다리면 됨
Keepalive Timer
오랜 기간 동안 idle 상태에 있는 것 방지
서버가 2시간 동안 Client로부터 세그먼트를 전송
받지 못하면, probe 세그먼트 전송
Congestion Control
혼잡제어
Packet Switching은 중앙에서 경로 설정 및 모니터링 을 하지 않으며 성능에 대한 보장이 되지 않음
혼잡해지면 패킷을 버림
딜레이는 처음에는 괜찮다가 Capacity에 가까워지기 시작하는 순간 급격하게 늘어남
Throughput(읽는 속도) : Capacity까지는 꾸준히 늘어나다가 넘어가는 순간 패킷 로스, 재전송 등으로 인해 네트워크 속도가 감소함
Congestion Avoidence
Additive Increase
cwnd를 일정 크기로 잡고 보냈을 때, 온전히 돌아온다면, 하나씩 더 보내보면서 반응이 온전히 돌아오는지를 확인해봄
이를 통해 아직 혼잡이 생겼는지 아닌지를 파악 가능
다만 적당량을 알 수가 없고, 1씩 점진적으로 진행하기에는 비효율적일 수 있음
Slow Start, Expotential Increase
보내는 양을 2배씩 늘리면서 확인해보는 것
=> Threshold가 존재해서, Threshold 전까지는 2배씩 증가하지만, 넘어가면서부터는 Additive Increase 방식으로 cwnd를 늘려가면서 진행
Slow Start인 이유
Flow Control은 상대가 받을 수 있는 크기만큼 바로 한꺼번에 보내는 반면, 1..2..4.. 이런 식으로 작은 값부터 시작하기 때문
AIMD 방식
Additive Increase Multiple Decrease
처음에 Threshold까지는 Slow Start 방식으로 진행하다가, Threshold에 도달하면 Additive Increase 방식으로 전환함
3ACKS 현상 or Time-Out이 일어나면 패킷 로스로 간주하는데, Time-Out은 심각하다고 가정하고 cwnd를 1 MSS로 설정 및 Threshold 값을 window 사이즈의 절반으로 해서 다시 진행, 3ACKS는 cwnd를 절반으로 줄인 뒤 다시 진행
TCP Fair
Connection 1과 Connection 2가 같은 대역폭을 공유하고 있을 때, RTT가 같다면 처음에 둘의 대역폭 사용량이 차이나더라도, 결국 AIMD로 늘리고 줄이게 되는 과정에서 동등한 대역폭을 사용하게 됨
window size는 반응을 보고 달라지기 떄문에 RTT에 따라 달라짐
RTT가 달라지면 1:1로 동등해지지 않음
Timer
Retransmission
패킷 로스를 감지하기 위한 Timer
3 Duplicated ACKS에 의해서도 감지를 하지만 Timer에 의해서도 Detect을 하는데 그 때 사용하는 Timer
=> RTT 바탕
RTO
Retransmission Time Out
처음은 초기값
그 이후
RTO = RTTs(평균) + 4 * RTTd(편차)
Smoothed RTT (RTTs)
처음은 아무 값도 X
첫 번째 측정 이후 => RTTs = RTTm
그 이후
RTTs = (7/8) * RTTs * (기존 평균값) + (1/8) * RTTm(측정값)
RTTd
처음은 아무 값도 X
첫번째 측정 이후 => RTTd = RTTm/2
그 이후
RTTd = (3/4) * RTTd + (1/4) * abs(RTTs-RTTm)
RTT
패킷이 갔다 오는데 걸리는 시간
EWMA
Expotential Weight Moving Average
가중치를 반영한 평균
=> RTTs와 RTTd는 EWMA지만 RTO는 X (자기 자신에 대한 가중치가 없음)
Karn’s Algorithm
만약 Time Out이 되서 다시 Retransmission을 했을 경우, 시간 측정 기준은 Retransmission을 했을 때를 기준으로 잡아야 함
하지만 만약 Retransmission을 하자마자 ACK이 들어오고서 Retransmission에 대한 ACK은 모종의 이유로 사라졌을 때 온 ACK이 이전의 transmission에 대한 ACK인지 Retransmission에 대한 ACK인지 알 수가 없음
=> 재전송 되는 패킷은 RTT 계산에 쓰지 말자
Persistence
교착상태를 해결하기 위하여 사용
rwnd를 0으로 보냈다가 1 이상의 정상적인 값으로 보냈을 때 이것이 손실되어 서로 교착상태에 빠지는 것을 방지하기 위한 Timer
Timer가 만료되면 probe 세그먼트를 전송
Keepalive
오랜 기간 동안 idle 상태에 있는 것 방지
비정상적으로 종료가 되어 Fin Fin+Ack Ack 꼴로 종료가 되지 않아서 계속해서 불필요한 연결이 유지되는 것을 방지
서버가 2시간 동안 Client로부터 세그먼트를 전송받지 못하면 probe 세그먼트 전성
TIME_WAIT
연결 종료 요청하는 대상이 TIME_WAIT에서 기다리는 시간 체크하기 위한 Timer
TCP Header Option
Single-byte
End of option list
Header는 항상 한줄이 4byte인 구조
만약 option이 4의 배수로 나뉘어 떨어지지 않을 경우 나머지 뒷공간을 채우는 아무 의미 없는 빈칸 채우기용 옵션
한줄에 한 번만 쓸 수 있음
No operation
앞 공간을 채우는 아무 의미 없는 빈칸 채우기용 옵션
EOF와 다르게 여러 번 쓸 수 있음
Multiple-byte
Maximum segment size
기본적으로 512byte가 최대 크기지만 Client와 Server가 최초 연결 시 서로 협의해서 조정할 수 있음 그 때를 위한 옵션
Window scale factor
rwnd를 사용해서 receiver window size를 전송하는데, rwnd만으로 대규모의 크기를 표현하기에는 한계 O
rwnd 크기를 확장하기 위한 옵션
2 ^ (Window Scale Factor 내부에 Scale factor의 값)을 rwnd에 곱한 값이 실제 rwnd가 됨
Timestamp
RTT Measurement할 때 사용
보낸 데이터에 대한 ACK이 올 때 패킷 내부에 본인이 데이터를 보냈을 때의 시간이 들어있음
=> 이를 통해 현재 시간과 내부에 들어있는 시간 차를 이용해서 RTTm 측정 가능
또한 PAWS 용도로도 쓰임
PAWS
Protection Against Wrapped Sequence Number
Sequence Number를 32bit 크기로 사용하는데, 통신을 주고받다 보면 썼던 Sequence Number를 다시 사용하게 될 수 있는데 늦게 들어온다던지 등의 이유로 기존 것이랑 헷갈림
=> 구분 위해서 Time Stamp Value 이용
SACK-permitted
패킷 손실이 나서 중간에 데이터가 유실되었을 경우, Sender 측에서는 그것 이후로 이미 보낸 패킷들도 다 재전송함 (어느 부분을 받고, 못받았는지 구분 어려움)
=> 패킷 로스 이후의 상황을 파악하기 어려움
이를 방지하기 위해서 최초 연결 시 옵션으로 설정해서 사용
SACK
블럭 형식으로 ~부터 ~까지 받았는지를 쌓아둠
=> 이를 보고서 어디 어디를 못받았는지를 확인 가능
UDP
Boundary Delivery
Application에서 생성된 메세지 단위로 Segment를 보내는 것
특징
- Reliability 신경 안씀 (패킷 로스 등, 상대가 응답하든 말든, 버퍼가 꽉 찼든 신경 X)
- CBD (Constant Bit Rate)로 전송 속도가 일정
IPV4
32bit로 구성된 주소, 보기 편하게 byte 단위로 끊어서 십진법으로 표현한 4개의 숫자로 표현
전세계에서 유일한 주소 (사설망 등 일부 제외)
Class of Address
A class 주소
맨 앞의 첫번째 bit가 0이면 A 클래스
범위
0~127.~.~.~
B class 주소
맨 앞의 2 bit가 10이면 B 클래스
범위
128~191.~.~.~
C class 주소
맨 앞의 3 bit가 110이면 C 클래스
범위
192~223.~.~.~
D class 주소
맨 앞의 4 bit가 1110이면 D 클래스
D 클래스 주소는 Multi casting을 위해서 사용 됨, 참고로 E 클래스는 나중을 위한 것
범위
224~239.~.~.~
Net id and Host id
IP 주소를 2개로 끊어서 읽을 수 있는데 앞 부분(해당 Network를 대표하는 Id)을 Net id, 뒷 부분을 Host id(같은 Network에서 구분되는 id) 라고 함
각 Net id별로 Host id를 가지게 되는데, 만약 Host id를 1000개를 사용할 수 있는데, 2개만 사용하면 나머지 998개가 그냥 버려지므로, 효율적으로 쓰기 위함
=> Router는 Network들을 연결하기 때문에, 연결시켜주고 있는 각 네트워크별 주소와 포트의 Mac 주소를 받음
A 클래스는 Net id가 1 byte, B 클래스는 Net id가 2 byte, C 클래스는 3byte
Classful Address
Class가 있는 주소
Network Address
시작 주소라고도 하며, Host id가 0인 것을 의미함
Network의 ID처럼 쓰임
Special Address
끝 주소이며, Host id가 모두 (비트로) 1인 주소를 의미
Directed Broadcast를 위해서 사용하며 일반 Device들에게 할당 X
단점
딱 필요한 만큼 사용하기가 어려움
Routing Table
구조
Network Address
목적지 주소를 가리키는 Network Address 정보
Next Hop
Network Address로 가려면 어디로 가야 하는지를 알려주는 정보
Interface
구분하기 위한 Number
모든 주소를 담기에는 너무 많음으로, 각 Network의 시작주소를 Network Address에 넣어서 관리
=> 만약 특정 Address에 대한 요청이 오면, Network의 클래스를 파악하고, 해당 Network의 Net id를 찾음
다만 B 클래스처럼 큰 주소들은 하나의 Network로 관리 X
Network의 Net id 구하는 법
- 목적지 Address를 보고서 무슨 클래스인지 파악
- 클래스를 파악하고서 Net id가 몇 Byte인지 파악
- Net id 부분의 bit를 전부 1로 설정하고 Host id 부분은 0으로 설정한 뒤 (Netmask) 목적지 Address와 AND 연산 진행해서 추출
NetMask
Net id 부분은 전부 1, Host id 부분은 전부 0으로 구성되어 있는 32bit 주소
SubNet
B 클래스 주소 같이 큰 주소들은 하나의 Network로 관리 X
하나의 Network을 세부적으로 Small Group으로 나눔
이를 SubNet이라고 함
2^n개의 Subnet을 만들기 위해선 Net id 외 추가적으로 n bit만큼이 필요
=> 외부에서는 SubNet이 있는지 없는지 모름, 단지 해당 Network이 자체적으로 효율적으로 관리하기 위해 설정한 것
=> SubNet을 사용하는 해당 Network와 연결된 Router만 사용한다는 것을 알고서 어떤 IP가 어떤 Subnet에 있는지만 알고 있으면 되고 SubNet이 몇 개로 구성되어 있어서 몇 bit를 봐야 SubNet 주소를 끄집어 낼 수 있는지 알 수 있으면 됨
Classless Address
두 단계로 끊어서 읽는건 Classful과 동일
단 Classful Address에서는 Byte 기준으로 끊었다면, Classless Address에서는 Bit 단위로 끊음
또한 앞부분을 prefix, 뒷부분을 suffix라고 함
Prefix 부분에서 구별 가능한 주소 하나하나를 Block이라고 함
이제 Class가 사라졌으므로, 끊어읽기를 어떻게 해야 하는지를 알 수 있도록 하기 위해서 주소 뒤에 /prefix length 꼴로 추가적인 정보를 명시해주어야 함
ex: ~~~/20
Classless 내부에서도 Subnet을 생성할 수 있고 이때는 prefix length + subnet length까지 포함한 값을 명시해서 구분할 수 있도록 해주어야 함
만약 각각의 Address 크기가 다른 Sub Group을 만들어야 한다면 Address 크기가 큰 것부터 할당하면서 prefix가 겹치치 않게 설정
Special Address
종류
Loopback Address
첫번째 자리가 127로 시작하는 주소
한 컴퓨터에서 Server와 Client를 실행하고 싶을 때 사용
All-Zero-Address
보통 집에서는 컴퓨터를 킬 때마다 달라지는 유동 IP를 사용
유동 IP의 경우, 최초에 DHCP 서버에게 어떤 IP를 쓸지 물어보기 위해 패킷을 보낼 때 자기 자신의 주소를 모르기에 source를 0.0.0.0 으로 해서 보냄
destination은 DHCP Server 주소를 모르므로 전부 1로 설정한 255.255.255.255로 해서 보냄
DHCP 프로토콜
IP를 할당해주는 프로토콜
Limited Broadcast Address
255.255.255.255
Destination 주소가 모두 1로 되어 있으면 같은 네트워크 내에 불특정 모두에게 전송
Router는 다른 네트워크로 패킷이 흘러가지 않도록 블럭함
Directed Broadcast Address
Suffix가 다 1인 경우 (모든 것이 1인 Limited Broadcast Address와 차이)
Router가 자기와 연결된 네트워크 내 모든 장치들에게 보내야 할 것이 있을 때 사용
사설망
내부적으로 사용하는 망
ex: 192.168.~.~
NAT
Network Address Translation
사설망은 사설망을 위한 주소들(유일 X)이 있는데, 사설망에 있는 것에서 바깥으로 패킷을 날리면 해당 IP와 Port 번호를 라우터가 가지고 있는 고유 IP와 임의의 Port 번호로 바꿔서 보내고, NAT translation table에 기록해둠
밖에서 고유 IP와 Port 번호로 응답을 보내면 Router에서 Port 번호를 보고 사설망의 어디의 몇 번 Port인지 찾아서 전해줌(NAT Translation Table로 들어가서)
랑데뷰 서버
사설망 내의 Client가 사설망 밖의 Server로 접속할 때는 NAT를 이용해서 변환시켜 보내면 되니까 문제 X
하지만 Server를 사설망에서 실행하여, 외부의 Client가 사설망 안의 Server로 접속할 때가 문제
=> 먼저 사설망 쪽에서 접근을 했다면 Source Address를 보고서 그대로 전달하면 되지만, 아니라면 알 수가 없음
랑데뷰 서버에 기록해두어서, 사설망 내부의 기기에 접근할 수 있는 IP 주소를 기록해두어서, 접근하고 싶을 시 랑데뷰 서버를 보고서 파악
=> Hole Punching
사설망 내부 IP 및 포트와 할당된 IP와 할당된 포트를 기록해둠
Port Forwarding
Port마다 특정 네트워크를 대입
위의 과정을 매뉴얼화 해놓은
Delivery
Direct Delivery
같은 Network에서 다른 Network로 가지 않고 전달하는 것
다른 Network에서 넘어와서 Router를 통해서 전달되는 것도 Direct Delivery => Router가 최종 목적지로 전달하는 것
Indirect Delivery
다른 Network로 가기 위해 Router에게 보내는 것
Router가 Router에게 보내는 것
Forwarding
Routing Table을 보고 일을 하고서 Next Hop으로 갈 수 있게끔 Interface에 Packet을 놓는 것
=> Routing Table도 같이 일을 함
종류
Fowarding based on
Next Hop Method
Routing Tables Based On Route
Destination과 현재 위치에서 Destination까지 가는데 거치는 모든 Route들을 적어서 보내는 것
Routing Tables Based On Next Hop
Destination과 현재 위치에서 Destination까지 가기 위해 필요한 Next Hop만 적어서 보내는 것
Network Specific Method
특정 Class의 Network의 모든 주소를 관리하는 Routing Table을 만들 수 없기 때문에,
대표하는 Network에 대한 Next Hop만을 저장해서 관리함
Host Specific Routing
특정 주소는 어떠한 경로로 가라고 구체적으로 적어 놓을 때도 있음
=> 이 때는 Table 안에 Host의 주소가 들어감
Table안에는 Network주소로만 구성되는 것 X, Host 주소도 있을 수 있음
Default Routing
주변에 있는 Network에 대한 정보만 가지고 있고, 저 멀리에 있는 Network에 대한 정보 가질 필요 X
특정 네트워크 주소가 아니면 나머지는 이쪽으로 가라는 식으로 Table이 심플하게 구성되어 있음
Routing Table은 Class 별로 존재
EX: N1 네트워크에 해당하면 ~, 아니면 ~ 꼴로도 Table을 구성할 수 있음
과정
- 주소를 추출함
- 주소의 클래스를 찾음 (Classful Address의 경우)
- Mask를 적용해 Network 주소 찾아냄
- 해당 Class의 Routing Table로 가서 정보를 찾아냄
- ARP로 Mac주소를 찾아냄
ARP
MAC 주소 찾는 Protocol
Address Aggregation
Router에는 주소에 대해서 Next Hop으로 가려면 어디로 가야하는지 Interface를 가리켜 줌 다만 예를 들어 11.1.0, 11.1.1, 11.1.2, 11.1.3 처럼 주소가 있고 이것들이 우연히 모두 같은 Interface로 간다면, 굳이 각각에 대한 것을 적지 않고 11.1에 대해 해당 Interface에 가라는 식으로 저장할 수 있음 => SubNet 개념은 X
이런 식으로 Routing Table의 크기를 줄일 수 있음
만약 우연히 똑같이 11.1로 시작하는데 다른 Interface로 가야한다면, 우선적으로 해당 경우에 대해서 체크 를 하는 식으로 진행
Routing Table은 기본적으로 가장 위에 있는 것부터 확인하게 되는데, 상단에 먼저 체크해야 할 것을 올려놔서 체크를 할 수 있도록 함
MPLS
Multi protocol Label Switching
=> 기존의 방식은 Routing Table이 주소를 Table에서 순차적으로 탐색해가면서 해야 해서 오래 걸리는 문제 있었음
Header를 수정 => Ethernet과 IP Header 사이에 MPLS Header를 삽입
In Label, Out Label, Destinaton, Out Interface가 존재하고, 자신과 연결된 곳에서만 유효한 Number를 지정해서,
In으로 ~번 Label이 들어오면 ~번 Label로 보낼 거라는 걸 알 수 있게 함
Destination이 같이 있어서 ~로 보낼거면 ~label로 보내야 한다는 것을 알 수 있게 함
쉽게 얘기해서 ~로 가고 싶다면 ~ Interface로 설정을 해서 보내라 하는 식으로 구성되어 있음
Web and Http
WEB Page 정의
다양한 Object들로 구성
Object : HTML File, JPEG 등
기본적으로 HTML로 구성 및 다양한 Object들 포함
HTTP
HyperText Transfer Protocol
Application Layer에 존재하는 Protocol
HTTP는 TCP를 사용
HTTP는 Stateless
Connection 종류
Non-persistent
연결을 지속하지 않는 방식 사용자는 HTML을 받으면 그걸 파싱해서 화면에 뿌려줌
만약에 10개의 Object들을 받아야 하면, 각각 Object 하나에 대해서 주고 받고를 확인하면서 진행
하나의 Object 파일에 대해서 왔다 갔다 하므로 2*RTT만큼의 시간이 걸림
Persistent(HTTP 1.1)
Non Persistent HTTP의 문제 때문에 Persistent 방식으로 변경
종료를 바로 하지 않고 나중에 함
방식
No Pipelining
연결은 종료되지 않지만, 하나의 파일을 받으면 다음 파일을 요청하고 받는 식의 방식
Pipelining
연결이 종료되지 않으면서, 전에 요청했던 파일 수신 여부와 상관없이 필요한 데이터들을 바로바로 요청
기본적으로 Server는 파일을 보내도 TCP를 바로 끊지 않고 살려두고 Client는 뒤에 오는 Request를 종료되지 않은 Connection으로 바로 보냄
단점
HEAD OF BLOCKING
앞에 있는 데이터가 크면 뒤에 있는 데이터는 앞에 있는 데이터를 다 받기 전까지는 못받음
HTTP 2.0
보내야 하는 Object들을 Frame으로 나누고, 한번 보낼 때, 파일 별로 순차적으로 Frame을 균등하게 보냄
IPv4
Network Layer의 Protocol
IPv4 Datagram 구조
Total Length
Header와 Data를 포함한 전체 길이가 무조건 46바이트 이상이 되어야 함
근데 46바이트 이상이 되지 못하면, 뒤에 Padding을 붙혀서 강제로 46바이트를 맞춰줘야 함
단 이 때 뒤에 남은 Padding은 유효한 데이터가 아님을 알 수 있도록 해야 함
=> 전체 길이를 알려주어야 함 => 16bit의 Total length에 표기
Time to Live
Hop to Hop을 얼마나 할 건지 설정
목적지에 가지 못하고 Loop 되는 것을 막고 자동 소멸될 수 있도록 하기 위함
HLEN
4bit의 헤더 길이 알려주는 것
HLEN값 * 4를 해야지 실질적인 Header길이 알 수 있음
MTU
Maximum length of data
허용할 수 있는 IP Datagram의 Maximum이 틀림
만약 Maximum이 작아서 패킷들을 분할해서 보내야 할 때면 Data 부분만 분할되고 헤더는 분할이 안됨
Flag Field
3bit인데 상위 1bit는 쓰지 않고 뒤에 있는 두 bit만 사용
분할할 지 말지 설정하는 옵션
D 옵션
Do not fragment
크기가 한번에 다 안들어가면 분할을 해야 함
다만 분할을 하지 말라고 이 옵션이 켜져 있는데, 한번에 다 안들어가면 그냥 버려버림
M 옵션
More fragment
만약 Fragment로 다 쪼갠 다음 목적지에 모여서 조합을 할 때, 쓰이는 필드
만약 Fragment로 나눌 경우 Strict Source Route와 Loose Source Route 옵션은 Fragment에도 복사되지만 나머지는 복사되지 않음
=> 만약 이게 켜져 있다면 아직 뒤에 더 올 수 있는 fragment가 있다는 것
=> 마지막 패킷을 구분하기 위해 쓰는 것
Fragmentation offset
다만 Move Fragment가 켜져 있을 때 이게 처음 패킷인지 중간 패킷인지 알 방법이 X
=> Fragmentation Offset으로 구분
최대 패킷 크기는 6만~까지 65535까지 보낼 수 있는데, 13bit로는 대략 8천정도까지밖에 포함 안됨
=> Fragmentation Offset * 8정도로 계산하면 모든 구역을 표현할 수 있음
=> Fragmentation Offset * 8로 실제 Offset을 계산할 수 있음
보낼 땐 시작 위치를 8로 나눈 값을 Fragmentation Offset으로 설정해서 보냄
Identification
Sequence Number처럼 번호 붙임
손실 여부 아닌 재조합 목적
Option
종류
Single Byte
둘 다 빈 공간 채우는 용
No Operation
End of Option
Multiple Byte
Record Route
어디를 지나서 왔는지를 기록할 수 있는 옵션
Router가 나가는 쪽의 주소를 쓰게 됨
Strict Source Route
가는 경로를 패킷에 써주는 방식
원래는 보내는 쪽 주소와 받는 쪽 주소만 받고 보내게 되지만, 이 옵션을 키면 가는 경로를 부여할 수 있음
그리고 도착하면 포인터로 가리키고 있던 곳의 주소와 Destination을 바꾸면서 진행함
=> 자연스럽게 경로를 설정했던 공간은 도착하고 나면 내가 지나왔던 곳들을 기록한 곳으로 바뀌게 됨
경로가 없으면 그냥 버려버림
Loose Source Route
경로를 지정하긴 하지만 Strict와 달리 경로 사이사이에 다른 곳을 들렀다가 가도 됨
=> 당장 다음 경로 안보인다고 버리지 않음
Time Stamp
기본적으로 출발할 때의 시간을 적는데, 옵션에 따라서 적을 정보가 조금씩 달라짐
옵션
- 시간만
- IP주소랑 시간
- IP주소는 주어졌고, 시간만 적음
Network 설정 필요 요소
IP주소
Subnet Mask
Next hop
DNS 서버 주소
IP Checksum, TCP Checksum 차이
IP header checksum은 IP 헤더에 대해서만 check함 TCP checksum은 TCP 헤더와 payload(데이터)까지 check함
Ping
Ping을 쓰는 이유는 RTT를 측정하기 위함도 있지만, Domain의 서버가 Network에 연결되어 있는지 안되어 있는지를 확인하는 용도
-R 옵션을 주면 record route 옵션 가능
traceroute
Record Route + domain name까지 가는 RTT를 3번 구함
-g 옵션을 주면 loose source route가 됨
-G 옵션을 주면 strict source route가 됨
Reassembly table
ID가 있는 패킷들을 리스트로 관리하는데, Timeout 값이 정해져 있고 시간이 지나면 재조립 못함, 가지고 있던 거 다버림
TCP 크기를 크게 하면 데이터를 많이 옮길 수 있어서 좋아보이지만, TCP가 크면 fragmentation을 더 잘게 해야 하고 그러면 패킷 로스가 일어날 확률이 늘어나며 감지 시간도 오래 걸림