TCP
transmission control protocol
- connection-oriented protocol
- connection setup
- connection teardown
- reliable delivery
- message가 destination process까지 에러 없이 전달된다.
- message가 순서대로 전달된다.
TCP
TCP is stream delivery service
- TCP delivers data as a stream of bytes
- Each byte is numbered
- Send buffer and receive buffer
- TCP 내에 buffer에 먼저 쓰고, 버퍼 체크 후 보낸다
- 둘은 서로 independent
- TCP segment : a portion of byte stream + TCP header
- packet과 비슷한 개념
- segments라고 불린다.
TCP Connection
- TCP는 connection oriented protocol이다
- 연결을 맺으면 양방향이다. (bi-directional)
- SYN : connection setup
FIN : connection teardown
TCP Numbers
Byte number
- byte stream에 있는 각 byte는 byte nubmer를 갖는다
- stream의 첫 번째 byte는 0부터 (2^32-1) 사이의 랜덤값을 할당받는다
그 숫자부터 시작해서 하나씩 커진다
- 만약 byte stream이 6000 bytes를 갖고,
random number가 1057로 설정되었으면,
bytes are numbered from 1057 to 7056
Sequence number
- 각 TCP segment는 sequence number를 갖는다
- sequence number는 segment에 carry된 first byte의 byte number이다
(뭔소리야 이게..)
- TCP connection이 5000 bytes를 보내야 하고,
byte number의 first byte는 10,001이다.
byte stream은 5개의 같은 size segment로 나눠질 때,
segment들의 sequence number를 찾아라
Acknowledge number
- receiver가 segment를 받으면, TCP-ACK message를 보내줘야 한다.
- ACK message 안에, receiver는 acknowledge nubmer를 포함시킨다.
- Acknowledge number
: the byte number of the last byte receiver received
without missing bytes + 1
- 다음번에 내가 받아야 하는 number
- "next expected byte"
- ack number가 5643이라는 건,
receiver가 5642로 시작하는 모든 byte를 정상적으로 받았다는 뜻이 된다.
- byte stream이 101부터 시작하고,
receiver가 받은 byte가 101, 102, 103, 106, 107, 110이면,
next expected byte는 104이다.
TCP Functions
- flow control /congestion control -> 왜 에러가 발생하는가
layer 2에서, 이더넷 와이파이 : 재전송을 해준다
근데 layer 4에서 또 재전송을 할 필요가 있나?
- layer 2에서의 오류 검출 : 빨간색 부분. 이런 오류를 체크할 수 있어
근데 아무리 여기서 체크를 해도, 검정색 부분(queue가 가득 차서 router가 패킷 drop, ...)은 layer 2의 재전송 기능으로 해결할 수가 없다.
그래서 TCP에서는 reliable한 기능이 필요하기 때문에 layer 4에서 또 재전송하는 기능이 필요하다.
- error control -> 에러 발생하면 재전송한다
Flow control
- receiver가 receiving bytes를 잘 다룰 수 있도록 sending speed를 제어한다.
- 중간 router에서 막히면 병목 현상이 발생할 수 있다
Congestion control
- level of network congestion에 따라 sending speed를 제어한다.
Error control
- erroneous segments are retransmitted for reliable delivery
- No option으로 20 bytes
- option으로 maximum 60 bytes
Source port / Destination port
Sequence number
- 32 bits
- segment의 first byte의 byte number
- sender가 receiver에게
Acknowledge number
- 32 bits
- receiver 입장에서 next expected byte
- receiver가 sender에게
HLEN
- header length
- 단위 : 4 bytes (IP header와 비슷)
Reserved
Window size
- 16 bits
- size of the advertised window
- receiver가 남은 buffer size를 sender한테 보내서, 이걸 보고 sender가 본인 속도 조절을 해.
- the sender should NOT send data more than advertised window
-> flow control
Control field
URG
- urgent pointer is valid
- segment includes urgent data
- 긴급하게 보낼 게 있다 -> 보내는 데이터에 끼워서 보낸다.
- urgent data : data NOT in the original byte stream
- the urgent pointer points to the starting point of the normal data
ACK
- acknowledge field is valid
- ack number가 valid하다
- SYN 제외하고 항상 1
PSH
- push the data
- 이거 빨리 올려라. 빨리 application에게 줘라
- immediately send buffered data to the application
- remote terminal 같은 interactive application에 이용된다
RST
- 서버가 하는거
- reset the connection (when server wants)
- 연결 재설정
SYN
- client가 하는거
- synchronize sequence number during connection (??)
- 연결 설정하기 위한 segment이다
- connection setup
FIN
- client가 하는거
- terminate the connection
- 연결 해제
- connection teardown