5. TCP
이해하면 인생이 바뀌는 TCP 송/수신 원리

TCP/IP 연결을 3way handshake 한다고 치자.
이를 깊이있게 한번 따져보자
서버의 상황을 한번 보자

누누이 얘기하지만 Socket의 본질은 파일임
서버는 프로세스
Process는 파일을 RWX를 할 수 있다.
read / write/execute
근데 소켓일때는 의미가 조금 달라짐
- R : Receive
- W : Send

File a.bmp가 있다고 하고 크기가 1.4mb 정도라고 하자.
그럼 보통 서버 개발자는 이 파일을 위한 메모리 크기를 담당하는데
이는 메모리 크기는 1.4mb보다 보통 작다.
64kb정도 라고하고, 이 파일을 64kb만큼 쪼개서 받아온다(read)고 보자.

그럼 이 들고있는 메모리를 다시 socket file에 쓸거고 TCP단으로 넘어갈때 분해가 날거다.
이 분해가 넘어가는 과정에도 또 메모리(Buffer)가 존재해 다시 Copy가 일어난다.
Buffered I/O라 부른다.
IP 단으로 넘어갈때 다시 잘게 쪼개는데 Segment로 쪼개짐

이 쪼개지는거에 순서를 붙임 (편의상 1,2,3…

Packet은 택배박스와 굉장히 유사함
이 박스에 택배를 집어넣는다고 보자.

이 Packet이 이제 Client로 최종적으로 날라간다.

Frame으로 최종적으로 간다
이제 클라단 컴퓨터 상황을 보자
서버와 마찬가지로
소켓과 연결된 File I/O Buffer도 존재하고
TCP Buffer도 존재하는 상황


세그먼트가 대략 두번 오면
택배가 두개 왔으니
잘 받았다고 ACK 3을 보낸다.
서버 단에서도 사실 세그먼트 1,2를 보내고 3을 보내지않고 Ack를 기다리기 위해 Wait한다

이로 인해 속도 지연이 발생한다.
TCP가 UDP느리다고 하는 이유가 이 때문

그리고 이 TCP Buffer의 크기를 Window Size라 함
수신측에서 세그먼트를 조립해서 넣는 공간
ACK를 보낼때 Window Size를 포함해서 보냄

3번을 보내는데 전송 할지 말지를 전송 window size를 보고 3번을 보내도 받을 공간이 없으면 안 보냄
수신측의
- Windows size > mss ? send
- 반대일시 Wait
그럼 이제 수신측에서는 받지 못하는 상황을 피하기위해선 TCP Buffer의 Segment를 빨리 퍼 올려야한다.
그러니 Receive 속도가 중요
Read 속도가 네트워크 수신 속도보다 빨라야함

이 Windows Size를 잘 체크하면 네트워크 어플리케이션 문제를 찾을 수 있음
읽는 속도가 너무 느리고 Window Size가 계속 줄어들더라
네트워크에서 장애원인을 찾으면 안됨
클라이언트 프로그램에서 찾아야함
수신이 느리다 : 결과적 현상
송신이 느린게 서버가 느려서 그런지, 받을준비가 안되서 느린지
체크 필요
TCP 연결이라는 착각에 대해
연결지향

port가 두개 존재
16bit으니 2^16 가능 근데 0, 1,65535도 안써서 그 뺀수 만큼 포트 사용가능
Sequence Number : 직소퍼즐의 번호 순서
32bit → 2^32 = 4GB
연결의 근거 ?
3 way handshake
목적
- 시퀀스 번호를 교환
- MSS도 교환함 작은 쪽에 맞춤.
- 정책 교환 : 혼잡제어 SACK

보안성이 없기에 속이려면 언제든지 가능함
TCP 연결, LAN선 뽑기 그리고 게임해킹!

여기서 랜 케이블을 뽑으면 TCP연결은 어떻게 될까?
뭔가 다운로드 하는 중에 랜 케이블을 뽑아보자
5초 뽑았다 다시 꽂으면 보통 연결이 다시 된다.
10초… 20초.. 늘리고 몇 초 이상 지나버리면 연결자체가 끊겼다고 얘기하고 닫혀버림
랜섭이 꼽혀 있는거 Link up이라함 (<> Link Down)
이 TCP 레이어는 밑의 모든 계층 연결이 된다는 전제하에 이뤄지는데 선이 뽑히면..
Link Down을 네트워크의 충격이라함
유선에선 잘 안나지만 무선에서는 허구한날 발생 함
지하철타면 기지국을 계속 갈아탐
RFC표준에는 몇시간 단위로 굉장히 긴데
대부분 아무리 오래잡아도 75초 이상 연결안되면 끊겼다고봄
만약 게임서버의 상황이라 생각해보자.
로그인하고 게임하는데 랜선을 75초이상 뽑았다 꽂았는데 제대로 연결됐다고 한다면 게임서버가 정상 작동을 안할 가능성이 높다.
이 사람이 하는 행동을 다른 사람 컴퓨터에도 업데이트 해줘야하는데 정상 작동이 안됐을 가능성이 높고 동기화가 깨질 가능성이 높음
그래서 이런 서버 개발할때 연결 세션 관리를 하는데 물리적인 충돌이있는데 이를 인지못하는지 아니면 신경쓰지 않아도 되는건지 지속적으로 확인하도록 프로그램을 짬.
이를 보통 keep alive라함 살아있는지를 계속 체크
랜선을 뽑아도 일정시간동안 유지된다.예민하면 5초만에.
Unicast, Broadcast, Multicast

라우터라는 애가 (NAT network address translation 공유기 느낌) 해당 라우터가 커버하는 영역 192.168.0.X ~ 192.168.0.255
- 192.168.0 c클래스 ip주소 Network id
- X Host id
라우터를 기준으로 내부 외부가 갈라짐
Unicast

내부 통신
Broadcast
L3 L2 모두 사용
Broadcast주소 : Host ID가 2진수로 모두 11111로 되어있을떄
IP address의 broadcast 주소 : FF
MAC address 의 broadcast 주소 48비트 : FFFFFFFFFF

전체 보냄
이더넷 : CSMA/CD 방식 사용
주황불
네트워크 효율을 떨어뜨리는 주요원인
해당 broadcast 중에는 엔드포인트 중 누구도 신호를 보낼 수 없다
Multicast
IPGF 방송하는데 연결 tv가 2000대면 2000대 전체에 송신하는건아니고 송신은 1회만하고 송신자쪽에 등록하고 송신받을 Group 등록된 사용자보고 골라보냄
L2수준에서는 Broadcast함’
SDN 에서 해당 부분 컨트롤하는게 중요
IP주소의 종류와 특징

Global IP : Internet 이라는건 Public, Global
→ 인터넷은 라우터의 집합체, 구성요소 라우터, DNS
라우터의 역할을 라우팅을 하는데 Global IP일때만 라우팅을 함 (강제로 세팅은가능)
기본적으로 인터넷에서 Global IP가 똑같은 놈은 없음
Private : 작은 소규모 인터넷을 구축

ABCD 클래스가 존재
D클래스는 멀티캐스트 어드레스 형
A클래스는 네트워크 id 8비트, 호스트 id 24비트
B클래스 : 16/16 : 큰 대학교
C 클래스 24/8 일반기업에서 많이 사용

클래스별로 사설 ip주소가 정해져있음
A 클래스 10.xxx
B 클래스 172.16..xxx
C 클래스 192.168.xxx
공유기에서 많이 사용 함
이 사설 아이피로는 Global IP를 잘 못쓰는데
이 공유기가 Global IP를 공유해줌
Loopback address 127.0.0.1 Host 자신을 의미

Routing 되지않고 IP단에서 process B로 넘어감
전세계 인터넷을 멈추는 방법과 DNS
이 DNS는 분산형 DB구조로 되어있음
계층적으로 되어있어 Root DNS가 전세계에 13대있음 얘네를 다 멈추면 멈춰짐

실제 시도
2002/10/22 루트 DNS해킹 DDOS공격 사건 9대가 실제로 장애가 남
03.1.25일 인터넷 대란 발생

www.naver.com 을 도메인 네임이라 함
www : 호스트 네임
naver.com : 도메인 네임
www.naver.com 를 쳤을때
- pc메모리의 dns cache를 뒤짐
- hosts file 검색
- DNS에 물어봄
공유기가 DNS forwarding을 제공 그래서 얘가 DNS인거마냥 응답해주기도 함
서비스 하고있는 ISP에서 응답을 제공함 (kt 168.126.63.1 , skt …)
받으면 그걸 cache로 들고있음
8.8.8.8 Google DNS

- cache dns에 질의 .com의 경우 RootDNS에 질의하면
- *.com 을 처리하는 DNS목록을 여러개 줌
- 그럼 다시 .com을 처리하는 DNS에 naver에 대해 질의
- naver를 다루는 DNS 목록을 줌
- www. 을 질의 그때 ip주소 전달

모든 응답에 유효기간을 설정 expire되면 다시 물음 (캐싱 유지하던거 날림)


nslookup 을 통해 질의 가능
TCP/IP통신과 MAC주소의 변화

IP Packet 헤더는 바뀌지않지만
Frame 에서 목적지는 PC → R#1으로 향함.
R#1에서는 Frame 해더가 R#1 → R#2 로 됨
MAC 어드레스는 패킷이 건너갈때마다 바뀐다.
MAC 어드레스가 유니크하긴하지만 L2에서만 쓰기에 다른 단에서 쓰는것 / IP 와 체계가 전혀다름

ARP(address resolution protocol) 프로토콜
IP 주소로 MAC 어드레스 추적
L2구간에서는 MAC 우선

포트마다 MAC을 저장
Switch가 하는일 MAC을 저장시킴
스위치 전원을 처음 켜면 학습모드로 들어감
L2 Ethernet Frame이 왔다갔다하는데 MAC어드레스를 서로 기억함

연결된 MAC을 서로 기억함

C에서 보낼때 MAC을 기억하고 있으니 바로 A로 보냄

10번 포트에서는 한 포트에 여러개가 있다고 생각 할 수도있음

만약 D, E랜선을 뽑아서 포트를 바꾼다면
재설정 or 다시 학습을 하던가 해야함
ARP의 작동

3번 PC가 꺼졌다가 켜졌다고 하자
설정상 IP주소는 알고있는데 GateWay의 MAC어드레스를 모르는 상황
네트워크 전체에 Broadcast 발송 쿼리를 날림

이중에 본인이 아니면 응답을 안함
Router가 응답을 하는데 이때 응답은 Unicast로 옴


그 정보를 이제 메모리에 캐싱함 ARP CAche
ARP Spoofing 같은것도 가능 MITM
길 잃은 Packet의 소멸과 TTL

IP에 TTL값이 같이 들어가는데

라우터 사이의 간격 Hop
Hop을 한번 건널때마다 TTL값을 1씩 감소시킴
TTL을 8비트라 0~255값가짐
값자체는 세팅, OS마다 다름
TTL이 0일때 소멸함
라우팅 세팅이 잘못되서 라우팅사이에 돌아버리는 경우

이때 라우터 cpu가 튀면서 상황이 지속되면 장비 다 죽음
네트워크 사고중에 가장 무식하고 파워풀한 케이스가 Looping임
Routing 이 버릴때 IP를 확인하고 ICMP 프로토콜을 이용해 시작 주소로 패킷 버려진것을 알려줌 (설정상 가능)
MTU와 Packet 단편화

단편화에 관한 얘기는 두번째 줄

Router1이 2로 보낼때 2의 MTU가 1400이라 무조건 단편화가 발생할 수 밖에없음

분할되었을때 재조립을 한다면 재조립은 보통 수식측에서 담당을 한다
현재에는 단편화가 거의 발생하지 않음
VPN 사용시 단편화가 날 수 있음
가래떡과 Stream

Header/Payload는 상대적인것
퇴근시간을 결정하는 TCP 장애유형 5가지

장애 대응의 대원칙 : 밑에서 위로 감
Layered 구조는 밑에가 성립해야 올라가는 것
- L1 L2 수준에서 Loss가 난것 (서버에서는 보냈는데 클라가 못 받은것)
- 인프라사이에서 문제가 될 수도있음
TCP 상
- Duplicate ACK
- Seg먼트를 보내고 wait를 하는데, 속도 높이려고 미리 보내는 케이스가 잇음
- Retransmission
→ 네트워크 지연을 의심 + 커널단에서 문제가 발생했을 수도 있음
⇒ 네트워크가 혼잡 상태로 인지 (TCP 혼잡 제어 )
네트워크 통신 속도를 낮춰버림
- Windows Size가 제로가 되는 경우
⇒ 수신측 버퍼가 꽉 찬 경우 / 어플리케이션을 의심해야함
- TCP 통신이 리셋
예를들어 네트워크에서 데이터를 받다가 강제로 킬하는 경우
OS에서는 서버쪽으로 RST를 보냄
스레드가 비정상적이거나 프로세스가 비정상 상태.

서버에 연결된 PC가 100명이 있는데 서버가 죽으면 100명에게 리셋 100개가 확 가버림
MSA multi segment analysis : 구간마다 선을 연결해서 Out of pass로 포트 미러링 하듯이 캡쳐 구간단위 속도를 계측해서 어디서 패킷이 loss되는지 추적
네트워크를 다시 또 내부로 자르는 서브넷팅
서브넷 왜하는걸까?
192.168.0.10

각 필드 기준으로 경우의수 256개
0 ~ 255까지

통상적으로 C class 의 경우 24bite를 네트워크 ID로 두고 Host 로 8비트를 둠
전체가 0인경우, 전체가 1인 경우(Broadcast) 사용 X
그래서 총 254개만 사용 가능
C class 주소 하나에 할당하면 254개 사용가능
만약 특정 회사에서는 C calss를 할당받고 ip가 100개만 필요한 상황이면 다른 154개의 주소가 낭비되는 상황 그래서 이를 방지하기 위해 서브넷팅을 이용

네트워크 ID를 25비트를 사용 그럼 할당가능 IP는 126개가됨
나눠진 class를 더 잘게 쓰기위해
서브넷을 나눌수록 2개 주소가 모자라게되기에 나눌수록 사용할수있는 ip가 줄어들어 나빠짐